<?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: ai</title>
    <description>The latest articles tagged 'ai' on DEV Community.</description>
    <link>https://dev.to/t/ai</link>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tag/ai"/>
    <language>en</language>
    <item>
      <title>7 Benefits of AI-Assisted Programming for Teams in 2026</title>
      <dc:creator>NLO Coding</dc:creator>
      <pubDate>Fri, 02 Oct 2026 18:15:53 +0000</pubDate>
      <link>https://dev.to/nlocoding/7-benefits-of-ai-assisted-programming-for-teams-in-2026-5e99</link>
      <guid>https://dev.to/nlocoding/7-benefits-of-ai-assisted-programming-for-teams-in-2026-5e99</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://nlocoding.com/en/blog/benefits-of-ai-assisted-programming" rel="noopener noreferrer"&gt;nlocoding.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;71% of developers now rely on AI-assisted tools daily—up from just 18% in 2023 (GitHub, 2026).&lt;/p&gt;

&lt;p&gt;AI isn’t a sidekick anymore. It’s the co-pilot driving the pace of modern programming. You’ll notice it in the code reviews, the pull requests, and the hiring decisions. The 2026 developer market? Ruthless efficiency or you’re out. It’s not hype if it’s quantifiable.&lt;/p&gt;

&lt;p&gt;73%Developers using AI tools in 2026 (GitHub)&lt;/p&gt;

&lt;h2&gt;
  
  
  AI-assisted programming is rewriting productivity math in 2026
&lt;/h2&gt;

&lt;p&gt;AI-assisted programming increases developer output by 32% on average, according to Stack Overflow’s 2026 Developer Report. That’s not theory—it’s 4.8 more features shipped per month per engineer at Shopify since deploying GitHub Copilot in Q3 2025. Forget 100x devs. This is the multiplier.&lt;/p&gt;

&lt;p&gt;The data shows that companies adopting AI &lt;a href="/en/blog/ai-powered-code-completion-plugins-for-jetbrains"&gt;code completion&lt;/a&gt; see 25% fewer bugs in production (JetBrains, 2026). Real savings: $340/month per dev, just from reduced debugging time. Actionable takeaway: If you’re not measuring feature velocity and bug rates before and after AI adoption, you’re missing the only metric that matters.&lt;/p&gt;

&lt;p&gt;💡&lt;strong&gt;Pro Tip:&lt;/strong&gt; Track deploy frequency and defect rates. The delta post-AI is your ROI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code quality isn’t subjective—AI makes it measurable and repeatable
&lt;/h2&gt;

&lt;p&gt;Most people get this wrong: AI-assisted programming doesn’t just write faster—it writes tighter. Snyk’s 2026 report found AI code suggestions reduce critical vulnerabilities by 41%. That’s not a typo. 41%.&lt;/p&gt;

&lt;p&gt;You’ll still need human review. But AI will catch the OWASP Top 10 before you’re halfway through your coffee. A real case: Atlassian implemented DeepCode in mid-2025 and slashed security incident response time from 17 hours to 3. Swapping guesswork for predictability. Actionable takeaway: Make AI code review mandatory before merge, not after.&lt;/p&gt;

&lt;p&gt;⚠️&lt;strong&gt;Common Mistake:&lt;/strong&gt; Relying on AI as a post-hoc linting tool. Integrate it into your CI/CD for real impact.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI-driven documentation is finally not a joke (and devs secretly love it)
&lt;/h2&gt;

&lt;p&gt;The data shows automated doc generation with AI reduces onboarding time by 53% (Sourcegraph, 2026). Read that again. More than half. Linear shipped a new knowledge base in 2026 powered by OpenAI Docs: onboarding dropped from 19 days to 8.5 for junior engineers. That’s a hiring edge you can quantify.&lt;/p&gt;

&lt;p&gt;Stop making devs write docs from scratch. The AI will do it, and they’ll thank you. Actionable takeaway: Connect your codebase to a tool like Mintlify ($45/month) and watch your documentation gap disappear.&lt;/p&gt;

&lt;p&gt;53%Onboarding time cut by AI docs (Sourcegraph, 2026)&lt;/p&gt;

&lt;h2&gt;
  
  
  Tool cost is transparent—AI is now a line-item, not a luxury
&lt;/h2&gt;

&lt;p&gt;AI-assisted programming isn’t a mysterious black box anymore. It’s priced like Slack. Here’s what real teams pay in 2026:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;thead&gt;&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Price (per dev/mo)&lt;/th&gt;
&lt;th&gt;Key Feature&lt;/th&gt;
&lt;/tr&gt;&lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
&lt;td&gt;GitHub Copilot&lt;/td&gt;
&lt;td&gt;$20&lt;/td&gt;
&lt;td&gt;Code completion, chat, PR suggestions&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;Tabnine Pro&lt;/td&gt;
&lt;td&gt;$15&lt;/td&gt;
&lt;td&gt;Private code models&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;Mintlify&lt;/td&gt;
&lt;td&gt;$45&lt;/td&gt;
&lt;td&gt;Automated documentation&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;DeepCode&lt;/td&gt;
&lt;td&gt;$30&lt;/td&gt;
&lt;td&gt;Security code review&lt;/td&gt;
&lt;/tr&gt;
    &lt;tr&gt;
&lt;td&gt;Replit Ghostwriter&lt;/td&gt;
&lt;td&gt;$10&lt;/td&gt;
&lt;td&gt;Multi-language support&lt;/td&gt;
&lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The actionable takeaway: Budget $50–$100/month/developer for AI tools, then compare it to the $14,200 average monthly cost of a U.S. engineer (Levels.fyi, 2026). Penny-wise, billion-dollar-foolish? Not anymore.&lt;/p&gt;

&lt;h2&gt;
  
  
  Team learning curves flatten—AI is forcing upskilling on everyone
&lt;/h2&gt;

&lt;p&gt;The data shows 67% of teams report junior devs reach mid-level proficiency in 11 months with AI-assisted programming, versus 19 months without (Pluralsight, 2026). It’s not about replacing people. It’s about compressing the apprenticeship.&lt;/p&gt;

&lt;p&gt;At ThoughtWorks, pairing AI copilots with pair programming cut time-to-promotion for junior engineers by 40%. The actionable takeaway: Pair every new hire with an AI assistant and track skill progression. Your “10x” engineer is now a team standard, not a unicorn.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"AI is not replacing developers. It's replacing the ramp-up." — Lana Ruiz, Lead Architect, ThoughtWorks&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Cross-language development is now practical, not just possible
&lt;/h2&gt;

&lt;p&gt;Most people get this wrong: AI-assisted programming isn’t just about Python or JavaScript. In 2026, 49% of engineers report using AI tools to ship code in a language they’d never used before (Stack Overflow). That’s not “dabbling”—it’s production code.&lt;/p&gt;

&lt;p&gt;Case: At Brex, a team of TypeScript engineers used GPT-4 Code Interpreter to migrate a legacy Python system in 5 weeks (previous estimate: 13 weeks). Actionable takeaway: Assign AI copilots to every cross-language project. The friction is gone. The deadline shrinks.&lt;/p&gt;

&lt;p&gt;💡&lt;strong&gt;Pro Tip:&lt;/strong&gt; Use AI to auto-generate code migrations and language translations. Don’t pay consultants $200/hour for something Copilot can do in minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;What are the concrete benefits of AI-assisted programming in 2026?AI-assisted programming in 2026 increases &lt;a href="/en/blog/ai-powered-developer-productivity-software-2026"&gt;developer productivity&lt;/a&gt; by 32%, reduces critical bugs by 41%, and cuts documentation and onboarding times by over 50%. These gains are confirmed by Stack Overflow, Snyk, and Sourcegraph reports.&lt;/p&gt;

&lt;p&gt;Are AI programming tools expensive for teams?AI programming tools typically cost $15–$45 per developer per month in 2026. For most teams, this is less than 1% of a developer’s monthly salary, making it a cost-effective investment relative to productivity gains.&lt;/p&gt;

&lt;p&gt;Will AI replace human developers entirely?No, AI is not replacing human developers in 2026. It accelerates routine tasks, improves code quality, and closes skill gaps, but human oversight and creativity remain irreplaceable.&lt;/p&gt;

&lt;p&gt;How do teams measure the ROI of AI-assisted programming?Teams measure ROI by tracking feature velocity, bug rates, and onboarding time before and after AI adoption. The improvement in these metrics directly correlates with financial and competitive returns.&lt;/p&gt;

&lt;h2&gt;
  
  
  You can’t opt out of this shift
&lt;/h2&gt;

&lt;p&gt;AI-assisted programming isn’t a tech trend. It’s the new baseline. Inertia is a choice—with a price. If you’re still debating Copilot or Tabnine, the real question is how much market share you’re losing while you hesitate. The future doesn’t wait. You shouldn’t, either.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;More articles at &lt;a href="https://nlocoding.com" rel="noopener noreferrer"&gt;nlocoding.com&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>career</category>
    </item>
    <item>
      <title>Google Unveils Gemini 4 Argon With 1 Million Token Context and Cybersecurity Focus</title>
      <dc:creator>Ali Farhat</dc:creator>
      <pubDate>Fri, 02 Oct 2026 18:15:30 +0000</pubDate>
      <link>https://dev.to/alifar/google-unveils-gemini-4-argon-with-1-million-token-context-and-cybersecurity-focus-18g1</link>
      <guid>https://dev.to/alifar/google-unveils-gemini-4-argon-with-1-million-token-context-and-cybersecurity-focus-18g1</guid>
      <description>&lt;p&gt;Google has officially introduced &lt;a href="https://scalevise.com/resources/google-gemini-4-argon-staged-rollout/" rel="noopener noreferrer"&gt;&lt;strong&gt;Gemini 4 Argon&lt;/strong&gt;&lt;/a&gt;, the next frontier model in its Gemini lineup. The model is positioned for high-value work in software engineering, knowledge-intensive business tasks, defensive cybersecurity, and multimodal analysis and creation. Its most consequential technical specification is support for &lt;strong&gt;up to 1 million tokens of context&lt;/strong&gt;, alongside introductory token-based pricing and a phased rollout that begins with trusted cyber defenders.&lt;/p&gt;

&lt;p&gt;In &lt;a href="https://blog.google/innovation-and-ai/models-and-research/gemini-models/gemini-4-argon/" rel="noopener noreferrer"&gt;Google's official Gemini 4 Argon announcement&lt;/a&gt;, the company describes Argon as a model intended to handle longer-running, more complex work than a typical single prompt. Google also says it is deploying safeguards for misuse risks, prompt injection, and misalignment as it expands access.&lt;/p&gt;

&lt;p&gt;For businesses evaluating AI systems, the announcement matters less as a generic model upgrade and more as a signal of where frontier-model competition is heading: larger working context, deeper domain performance, and more explicit support for tasks that combine documents, code, data, and operational judgment.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Gemini 4 Argon changes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  A 1 million token context window for longer workflows
&lt;/h3&gt;

&lt;p&gt;Gemini 4 Argon can accept up to &lt;strong&gt;1 million tokens&lt;/strong&gt; of context for long-horizon reasoning. Context is the information available to a model while it produces an answer, such as files, prior messages, code, instructions, or retrieved business material.&lt;/p&gt;

&lt;p&gt;A larger context window does not automatically make every response correct. It can, however, make it more practical to work across substantial bodies of material without breaking them into as many separate interactions. For example, teams handling lengthy codebases, legal materials, financial information, product documentation, or &lt;a href="https://scalevise.com/resources/gemini/" rel="noopener noreferrer"&gt;multimodal inputs&lt;/a&gt; may be able to provide more relevant source material in one workflow.&lt;/p&gt;

&lt;p&gt;The practical test will be whether Argon maintains useful reasoning and accurate outputs when that context is large and varied. Google points to engineering, financial, and legal evaluations as evidence of stronger domain performance, but individual organizations will still need to assess results against their own documents, processes, and quality requirements.&lt;/p&gt;

&lt;h3&gt;
  
  
  A stated focus on coding, knowledge work, security, and multimodal tasks
&lt;/h3&gt;

&lt;p&gt;Google identifies four major areas for Gemini 4 Argon:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Software engineering and coding&lt;/strong&gt;, including engineering benchmark performance and internal work such as codebase migrations to Rust.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://scalevise.com/resources/google-gemini-skills-workspace-rollout-explained/" rel="noopener noreferrer"&gt;&lt;strong&gt;Enterprise knowledge work&lt;/strong&gt;&lt;/a&gt;, with examples spanning legal and finance-related reasoning.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Defensive cybersecurity&lt;/strong&gt;, including autonomous vulnerability discovery and patching capabilities described by Google.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Advanced multimodal work&lt;/strong&gt; for creative and analytical tasks involving more than text alone.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That combination is notable because these categories often require a model to retain context across many inputs while following complex instructions. Google says it has used Argon internally for memory optimizations, &lt;a href="https://scalevise.com/resources/google-gemini-skills-reusable-stackable-instructions/" rel="noopener noreferrer"&gt;large-scale workflow tasks&lt;/a&gt;, and code migrations. Those examples illustrate the intended direction of the product, rather than guaranteeing the same outcomes for every user.&lt;/p&gt;

&lt;p&gt;For organizations, the likely near-term opportunity is not to hand over critical processes without oversight. It is to identify work where staff currently spend time assembling information, tracing relationships across source materials, or repeatedly moving between tools. Long-context models may reduce that preparation burden when integrated thoughtfully and tested against clear success criteria.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pricing and access are more concrete than a typical teaser
&lt;/h3&gt;

&lt;p&gt;Google has published an introductory pricing structure for broad access. Input tokens are priced at &lt;strong&gt;$2 per 1 million tokens&lt;/strong&gt;, while output tokens are priced at &lt;strong&gt;$10 per 1 million tokens&lt;/strong&gt;. Cached input tokens receive a &lt;strong&gt;95% discount&lt;/strong&gt; compared with the standard input-token price.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Usage category&lt;/th&gt;
      &lt;th&gt;Google's introductory pricing&lt;/th&gt;
      &lt;th&gt;What it represents&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Input tokens&lt;/td&gt;
      &lt;td&gt;$2 per 1 million tokens&lt;/td&gt;
      &lt;td&gt;Information supplied to Gemini 4 Argon&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Output tokens&lt;/td&gt;
      &lt;td&gt;$10 per 1 million tokens&lt;/td&gt;
      &lt;td&gt;Content generated by Gemini 4 Argon&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Cached input tokens&lt;/td&gt;
      &lt;td&gt;95% discount from the input-token price&lt;/td&gt;
      &lt;td&gt;Discounted reuse of cached input context&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The model is not being released to all audiences at once. Google says Argon is initially rolling out to a cohort of trusted cyber defenders through its &lt;strong&gt;Fairwind program&lt;/strong&gt;, with developers, enterprises, and consumers expected to receive broader access as soon as possible. The announcement does not provide a specific date for that wider availability.&lt;/p&gt;

&lt;p&gt;This staged release means business planning should separate what is announced from what can be deployed today. The published pricing is useful for early cost modelling, particularly for applications that process substantial volumes of input or generate long outputs. But organizations should confirm actual access, supported interfaces, applicable terms, and production readiness when Google makes those details available for their intended use case.&lt;/p&gt;

&lt;h3&gt;
  
  
  Security capabilities come with deployment limits
&lt;/h3&gt;

&lt;p&gt;Google presents defensive cybersecurity as a central Argon capability and describes autonomous vulnerability discovery and patching as part of its work in this area. It also says Argon includes protections related to CBRN and cyber misuse, prompt-injection resilience, and monitoring for misalignment.&lt;/p&gt;

&lt;p&gt;That emphasis is important because tools that can analyze code, systems, and vulnerabilities can create value for defenders while also requiring careful controls. Google's initial Fairwind rollout reflects that balance. The announcement supports the view that cybersecurity will be an early deployment focus, not that every company can immediately use Argon to autonomously remediate production systems.&lt;/p&gt;

&lt;p&gt;Businesses considering similar AI-assisted security workflows should treat the model as one component of a controlled process. Human review, defined access boundaries, logging, and validation remain practical necessities whenever outputs could affect code, infrastructure, customer data, or security posture.&lt;/p&gt;

&lt;p&gt;Gemini 4 Argon's stated mix of long context, domain-oriented reasoning, and token pricing gives companies a clearer basis for evaluating potential applications. The next meaningful details to watch are the mechanics of broader availability, the developer experience, and how performance translates from Google's reported evaluations to specific operational workloads.&lt;/p&gt;

&lt;p&gt;Long-context AI can create useful opportunities, but value depends on selecting the right workflows, preparing reliable inputs, and measuring results before scaling. Scalevise helps businesses turn promising model capabilities into practical implementation plans, from identifying high-value use cases to connecting AI with existing processes. &lt;strong&gt;&lt;a href="https://scalevise.com/services/ai-consultancy" rel="noopener noreferrer"&gt;Request an AI consultancy with Scalevise&lt;/a&gt; to evaluate where Gemini-class capabilities can deliver measurable operational value.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is Gemini 4 Argon?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Gemini 4 Argon is Google's newly announced frontier AI model in the Gemini line. Google positions it for software engineering, enterprise knowledge work, defensive cybersecurity, and advanced multimodal tasks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How large is Gemini 4 Argon's context window?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Google says Gemini 4 Argon supports up to 1 million tokens of context for long-horizon reasoning.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is Gemini 4 Argon's introductory pricing?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Google lists introductory pricing of $2 per 1 million input tokens and $10 per 1 million output tokens. Cached input tokens receive a 95% discount relative to the standard input-token price.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When will Gemini 4 Argon be broadly available?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Google says Argon is initially rolling out to trusted cyber defenders through its Fairwind program and that it plans to make the model available more broadly to developers, enterprises, and consumers as soon as possible. No specific broad-release date was provided.&lt;/p&gt;




&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Gemini 4 Argon is a confirmed new milestone for Google's Gemini platform, combining a 1 million token context window with an explicit focus on coding, knowledge work, cybersecurity, and multimodal tasks. Its phased rollout and published introductory pricing give prospective users useful signals, while also making clear that broader availability and real-world evaluation remain the next steps.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>tools</category>
      <category>gemini</category>
    </item>
    <item>
      <title>Building a Foundry Agent That Queries Fabric Data, On Behalf of the User</title>
      <dc:creator>Jubin Soni</dc:creator>
      <pubDate>Fri, 02 Oct 2026 18:13:43 +0000</pubDate>
      <link>https://dev.to/jubinsoni/building-a-foundry-agent-that-queries-fabric-data-on-behalf-of-the-user-243h</link>
      <guid>https://dev.to/jubinsoni/building-a-foundry-agent-that-queries-fabric-data-on-behalf-of-the-user-243h</guid>
      <description>&lt;p&gt;A regional sales manager and a sales rep both ask the same Foundry agent the exact same question: "show me revenue by region." The manager sees every region. The rep sees only their own. Same agent, same prompt, same tool call under the hood, two completely different answers, and nobody wrote a single &lt;code&gt;if user.role == "manager"&lt;/code&gt; line to make that happen.&lt;/p&gt;

&lt;p&gt;That's the pitch for wiring a Microsoft Fabric data agent into Microsoft Foundry as a tool. The integration isn't about giving your agent a new data source so much as it's about giving your agent a data source that already knows who's asking. Fabric has spent years building row-level security (RLS) and column-level security (CLS) into Power BI semantic models. Foundry has spent the last year building agents that can call tools mid-conversation. The thing connecting them is On-Behalf-Of (OBO) identity passthrough, and once you've set it up correctly, you stop worrying about data leakage through your agent because the enforcement never left Fabric in the first place.&lt;/p&gt;

&lt;p&gt;This is a hands-on build guide. We'll publish a Fabric data agent, connect it to a Foundry project, attach it as a tool using the &lt;code&gt;fabric_dataagent_preview&lt;/code&gt; tool type, and run it as two different signed-in users to prove the RLS boundary actually holds.&lt;/p&gt;

&lt;h2&gt;
  
  
  The mental model
&lt;/h2&gt;

&lt;p&gt;Before touching code, it helps to separate two things people conflate: the Fabric data agent and the Foundry tool that calls it.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Fabric data agent&lt;/strong&gt; is a Fabric-native object. You build it inside a Fabric workspace, you point it at one or more data sources (a warehouse, a lakehouse, a KQL database, or a Power BI semantic model), and you publish it so it has a stable endpoint. It already knows how to turn natural language into queries against those sources, and it already respects whatever RLS or CLS rules are defined on the underlying semantic model. This part exists independently of Foundry. You could use it from the Fabric chat UI tomorrow and never touch an agent framework.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Foundry tool&lt;/strong&gt; is a thin, typed wrapper that lets a Foundry agent call that published Fabric data agent mid-conversation. Foundry doesn't re-implement any of the security logic. It authenticates as the person using the agent, hands that identity to Fabric, and lets Fabric do what it already does: answer the question using only the rows and columns that identity is allowed to see.&lt;/p&gt;

&lt;p&gt;That handoff is the entire value proposition. If you've ever built a RAG pipeline where the retrieval step quietly ignored document-level permissions, you already know why this matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;A few things need to be true before any of the code below will work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A Fabric workspace on paid &lt;strong&gt;F2 or higher capacity&lt;/strong&gt;, or Power BI Premium &lt;strong&gt;P1 or higher&lt;/strong&gt; with Fabric enabled&lt;/li&gt;
&lt;li&gt;A published Fabric data agent, with at least one data source it has read access to&lt;/li&gt;
&lt;li&gt;The Fabric data agent and your Foundry project in the &lt;strong&gt;same tenant&lt;/strong&gt;, signed in with the same account&lt;/li&gt;
&lt;li&gt;Fabric data agent and underlying data sources on capacities in the &lt;strong&gt;same region&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;At minimum the &lt;code&gt;Foundry User&lt;/code&gt; (or &lt;code&gt;AI Developer&lt;/code&gt;) RBAC role on the Foundry project for both you and anyone who will use the agent&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;User identity authentication only.&lt;/strong&gt; Service principal authentication is explicitly not supported for the Fabric data agent tool. If your agent normally runs headless under a managed identity, this is the one tool call where that pattern breaks, and you need a real signed-in user in the loop.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last point trips people up the most, so it's worth repeating before you build anything: this tool is designed for interactive, user-facing agents. It is not a background job tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Publish the Fabric data agent
&lt;/h2&gt;

&lt;p&gt;In your Fabric workspace, create a new Data agent item, point it at your semantic model or warehouse, give it instructions on what it's good for, and test it in the Fabric chat pane until it answers correctly. Then publish it.&lt;/p&gt;

&lt;p&gt;Once published, open its endpoint URL. It looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://fabric.microsoft.com/groups/&amp;lt;workspace_id&amp;gt;/aiskills/&amp;lt;artifact_id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Copy both the &lt;code&gt;workspace_id&lt;/code&gt; and the &lt;code&gt;artifact_id&lt;/code&gt; out of that URL. You'll need both in the next step, and this is the only place to find them without digging through the REST API.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Create the connection in Foundry
&lt;/h2&gt;

&lt;p&gt;Foundry needs a connection object that stores those two IDs so the Fabric tool knows which data agent to call. You can do this in the portal or with the REST API. The portal path is simpler for a first run:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In your Foundry project, go to &lt;strong&gt;Build and customize &amp;gt; Agents&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Open an existing agent or start a new one&lt;/li&gt;
&lt;li&gt;Add a knowledge source, choose &lt;strong&gt;Microsoft Fabric&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Create a new connection, paste in &lt;code&gt;workspace_id&lt;/code&gt; and &lt;code&gt;artifact_id&lt;/code&gt; as custom keys, and check &lt;strong&gt;Is secret&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Name the connection and choose whether it's scoped to this project or shared across the account&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you'd rather script it, the same connection can be created directly against the management plane:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;PUT https://management.azure.com/subscriptions/&amp;lt;sub-id&amp;gt;/resourceGroups/&amp;lt;rg&amp;gt;/providers/Microsoft.CognitiveServices/accounts/&amp;lt;foundry-account&amp;gt;/projects/&amp;lt;project&amp;gt;/connections/&amp;lt;connection-name&amp;gt;?api-version=2025-04-01-preview
Authorization: Bearer &amp;lt;token&amp;gt;
Content-Type: application/json

{
  "properties": {
    "category": "CustomKeys",
    "authType": "CustomKeys",
    "credentials": {
      "keys": {
        "workspace_id": "&amp;lt;fabric-workspace-id&amp;gt;",
        "artifact_id": "&amp;lt;fabric-data-agent-id&amp;gt;"
      }
    }
  }
}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nothing in this connection object carries a user identity. It's purely routing information, pointing Foundry at the right Fabric data agent. The identity gets layered on later, automatically, at call time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Wire the Fabric tool into a Foundry agent
&lt;/h2&gt;

&lt;p&gt;With the connection in place, attaching it to an agent is a few lines in the SDK. The flow looks like every other Foundry tool: resolve the connection ID, pass it into a typed tool definition, and hand that tool to the agent definition.&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="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;azure.identity&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;DefaultAzureCredential&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;azure.ai.projects&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;AIProjectClient&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;azure.ai.projects.models&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;PromptAgentDefinition&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;MicrosoftFabricPreviewTool&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;FabricDataAgentToolParameters&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;ToolProjectConnection&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;project&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;AIProjectClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;endpoint&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;PROJECT_ENDPOINT&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;credential&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;DefaultAzureCredential&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;fabric_connection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connections&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="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;FABRIC_CONNECTION_NAME&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;agents&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_version&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;agent_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;sales-insights-agent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;definition&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;PromptAgentDefinition&lt;/span&gt;&lt;span class="p"&gt;(&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;gpt-4.1-mini&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;instructions&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;You are a sales insights assistant. Use the Fabric data agent tool &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;to answer questions about revenue, pipeline, and regional performance. &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Only answer from data the tool returns, never guess numbers.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="nc"&gt;MicrosoftFabricPreviewTool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;fabric_dataagent_preview&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;FabricDataAgentToolParameters&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                    &lt;span class="n"&gt;project_connections&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
                        &lt;span class="nc"&gt;ToolProjectConnection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;project_connection_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;fabric_connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                    &lt;span class="p"&gt;]&lt;/span&gt;
                &lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;tool_choice&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;required&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&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;Created agent version: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;version&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;Setting &lt;code&gt;tool_choice="required"&lt;/code&gt; is a small thing but worth doing deliberately. Without it, a sufficiently confident model will sometimes answer a numeric question from its own training data instead of calling the tool, which defeats the entire point of grounding the answer in live, permission-scoped Fabric data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Run it, and run it as two different users
&lt;/h2&gt;

&lt;p&gt;This is the step that actually proves the OBO flow works, and it's also the step people skip because it's more fun to write code than to go find a second test account.&lt;/p&gt;

&lt;p&gt;Calling the agent uses the Responses API, same as any other Foundry agent:&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="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_openai_client&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;responses&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;extra_body&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;agent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&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;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;agent&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;type&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;agent_reference&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;
    &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;What was our revenue by region last quarter?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&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;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;output_text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run that once, authenticated as a user who has full access to every region in the underlying semantic model. You'll get a complete breakdown. Now run the exact same script, same agent, same question, authenticated as a user who's scoped by RLS to a single region. The tool call looks identical on the Foundry side. The answer that comes back only has that user's region in it.&lt;/p&gt;

&lt;p&gt;Nothing in the agent's instructions, the tool definition, or the prompt mentions roles or regions. The restriction isn't implemented in your code at all. It's enforced by Fabric, using whatever RLS or CLS rules already exist on the semantic model, the same rules that would apply if that user opened the report directly in Power BI.&lt;/p&gt;

&lt;p&gt;Here's the shape of that single call, end to end:&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%2F0ddyyvkxle3viq2erqs0.png" 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%2F0ddyyvkxle3viq2erqs0.png" alt="A question, answered with the asking user's own Fabric permissions" width="799" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this fits in the bigger picture
&lt;/h2&gt;

&lt;p&gt;Zoom out past a single request and the interesting part becomes what stays constant. The Foundry agent is the same agent, with the same tool definition, regardless of who's using it. What changes per request is a token exchange that happens automatically, between Foundry and the Entra app registered on the connection, before the call ever reaches Fabric.&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%2Ff60z1usqhce6ztxt7s6d.png" 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%2Ff60z1usqhce6ztxt7s6d.png" alt="Two users, same agent, two different answers" width="799" height="339"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's the architectural payoff. You build the agent once. You don't build a separate agent per role, and you don't maintain a permissions table inside your application that has to stay in sync with whatever's configured in Power BI. The permissions model lives in exactly one place, which is also the place your data team already manages it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Production considerations
&lt;/h2&gt;

&lt;p&gt;A handful of things are worth knowing before this goes past a demo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One Fabric data agent per Foundry agent, for now.&lt;/strong&gt; The current tool only supports attaching a single Fabric data agent as a knowledge source. If you need to ground against multiple Fabric data agents, you're looking at multiple Foundry agents, or an orchestration layer in front of them, not one agent with several Fabric tools attached.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Service principals are a hard no.&lt;/strong&gt; If any part of your pipeline runs unattended, under a managed identity, with no real user in the loop, it cannot use this tool. Build your unattended paths against the underlying data sources directly, and reserve the Fabric data agent tool for interactive, user-present sessions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Region and tenant boundaries are enforced, not advisory.&lt;/strong&gt; The Fabric data agent, its underlying data sources, and the Foundry project all need to line up on tenant and region. If you're running a multi-region deployment, plan your Fabric capacity placement before you plan your agent architecture, not after.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compliance boundary shift.&lt;/strong&gt; Microsoft is explicit that once a Fabric data agent is consumed through Foundry, responses may leave Fabric's compliance boundary and get processed under Foundry's own terms. If your data has specific residency or compliance requirements, read that section of the docs closely before you wire this up for production traffic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Test with real RLS, not just admin accounts.&lt;/strong&gt; It's tempting to build and demo everything under your own developer account, which usually has broad access. The entire value of this integration is invisible until you test with a properly restricted account. Budget time for that before you call the integration done.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this leaves you
&lt;/h2&gt;

&lt;p&gt;The code to attach a Fabric data agent to a Foundry agent is genuinely small, a tool definition, a connection ID, a few lines. The part worth taking seriously is everything that small piece of code is standing on: years of RLS and CLS enforcement inside Fabric, an identity passthrough model that means your agent never has to see or store a permissions table, and a guarantee that whoever's asking the question only ever sees what they were already allowed to see.&lt;/p&gt;

&lt;p&gt;If you're building an internal agent on top of data your organization already governs through Power BI or Fabric, this is very likely less work than building and maintaining your own access control layer on top of a generic retrieval tool. Publish the data agent, wire up the connection, and let Fabric keep doing the job it was already doing.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/azure/foundry/agents/how-to/tools/fabric" rel="noopener noreferrer"&gt;Use the Microsoft Fabric data agent with Foundry agents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/fabric/data-science/data-agent-foundry" rel="noopener noreferrer"&gt;Consume a data agent in Microsoft Foundry (preview)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/fabric/data-science/data-agent-end-to-end-tutorial" rel="noopener noreferrer"&gt;Fabric data agent scenario (preview)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/azure/ai-foundry/how-to/connections-add?view=foundry-classic" rel="noopener noreferrer"&gt;Add a new connection to your project&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/fabric/data-science/data-agent-tenant-settings" rel="noopener noreferrer"&gt;Cross-geo processing and storing for AI in Fabric&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>data</category>
      <category>microsoft</category>
    </item>
    <item>
      <title>Luthier: an agent that audits an AI coding agent's harness against the repo it governs.</title>
      <dc:creator>Harish Kotra (he/him)</dc:creator>
      <pubDate>Fri, 02 Oct 2026 18:13:25 +0000</pubDate>
      <link>https://dev.to/harishkotra/luthier-an-agent-that-audits-an-ai-coding-agents-harness-against-the-repo-it-governs-171k</link>
      <guid>https://dev.to/harishkotra/luthier-an-agent-that-audits-an-ai-coding-agents-harness-against-the-repo-it-governs-171k</guid>
      <description>&lt;h1&gt;
  
  
  Your agent's &lt;code&gt;CLAUDE.md&lt;/code&gt; is lying to it, and nothing is checking
&lt;/h1&gt;

&lt;p&gt;Every team I talk to has the same artefact now: a &lt;code&gt;CLAUDE.md&lt;/code&gt;, an &lt;code&gt;AGENTS.md&lt;/code&gt;, a &lt;code&gt;.cursorrules&lt;/code&gt;, a folder of skills, an &lt;code&gt;.mcp.json&lt;/code&gt; with four servers in it. It is written in a burst of optimism, and then the code moves.&lt;/p&gt;

&lt;p&gt;Three months later:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the file it tells the agent to edit was renamed;&lt;/li&gt;
&lt;li&gt;the command it tells the agent to run is not a script anyone declares any more;&lt;/li&gt;
&lt;li&gt;one of the MCP servers points at a binary nobody has installed since the laptop was rebuilt;&lt;/li&gt;
&lt;li&gt;a skill directory exists on disk that no instruction file has ever mentioned, so the agent cannot know it is allowed to use it;&lt;/li&gt;
&lt;li&gt;and the convention everyone swears by — &lt;em&gt;no &lt;code&gt;console.log&lt;/code&gt; in committed code&lt;/em&gt; — is violated on line 4 of the entry point.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of that throws. Your tests pass. CI is green. The only symptom is that the agent takes forty minutes to do a four-minute task, edits a file that does not exist, and tells you confidently that it "found the relevant module".&lt;/p&gt;

&lt;p&gt;We check code into review, CI, a test suite, a linter and a type-checker. The harness — the file&lt;br&gt;
that decides what the agent believes about the codebase — is checked into git and then never&lt;br&gt;
verified again. &lt;strong&gt;Luthier is a checker for it.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  The idea in one paragraph
&lt;/h2&gt;

&lt;p&gt;Extract every claim the harness makes. Verify each claim against what is actually on disk. Report&lt;br&gt;
the delta, with the rule quoted at &lt;code&gt;file:line&lt;/code&gt;, the contradicting reality, and a unified diff you&lt;br&gt;
can apply. Score the result 0–100 so it is comparable between runs and repos.&lt;/p&gt;

&lt;p&gt;The claims are the unit of work, so the first job is a rule inventory.&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="nl"&gt;"rules"&lt;/span&gt;&lt;span class="p"&gt;:[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"r1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"CLAUDE.md"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"line"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="nl"&gt;"kind"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"path|command|skill|mcp|convention"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;verbatim rule&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="nl"&gt;"check"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"path_exists|command_runs|file_referenced|server_reachable|semantic"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"target"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"src/foo.ts"&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;Each rule names the check that can &lt;em&gt;falsify&lt;/em&gt; it. Four of the five checks are deterministic — no LLM,&lt;br&gt;
no network, no execution. The fifth is LLM-judged and degrades honestly when there is no key.&lt;/p&gt;
&lt;h2&gt;
  
  
  The architecture that keeps it honest
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;paste repo path (or drop a zip)
  |
  +-- discover harness ....... read_harness / inspect_repo   -&amp;gt; audit.log
  +-- extract rules .......... LLM (validated) + static fallback
  +-- check 1 path_exists .... glob against the real tree
  +-- check 2 command_runs ... declared in package.json / Makefile / pyproject  [never executed]
  +-- check 3 file_referenced  skills: declared -&amp;gt; used, on disk -&amp;gt; listed
  +-- check 4 server_reachable MCP schema + binary resolution  [never spawned]
  +-- check 5 semantic ....... mechanical subset offline, then LLM verdicts
  +-- score .................. 100 - sum(min(category_penalty, 32))
  +-- SSE progress -&amp;gt; runs/&amp;lt;id&amp;gt;.json -&amp;gt; scorecard / findings / evidence / fix diff
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The design constraint that shapes everything: &lt;strong&gt;the auditor may only assert what it has read.&lt;/strong&gt;&lt;br&gt;
There are exactly two ways to learn about the repo, and both are journaled.&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="nd"&gt;@tool&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;read_harness&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;paths&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&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="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Read harness/instruction files (CLAUDE.md, AGENTS.md, .cursorrules, skills,
    MCP config, README) and return their real contents with 1-based line numbers.
&lt;/span&gt;&lt;span class="gp"&gt;    ...&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;bundle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;read_harness&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&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;paths&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;paths&lt;/span&gt;&lt;span class="p"&gt;)})&lt;/span&gt;

&lt;span class="nd"&gt;@tool&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;inspect_repo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;globs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&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="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Ground truth about the repository: which files match each glob, their sizes,
    and the first 20 lines of each match. Call this before claiming anything about
    what the repo contains. Output is byte-capped and says so when truncated.
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;bundle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;inspect_repo&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&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;globs&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;globs&lt;/span&gt;&lt;span class="p"&gt;)})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;bundle.call&lt;/code&gt; is the interesting part: it runs the tool, measures the duration and the byte size of&lt;br&gt;
the payload, appends a JSONL record to &lt;code&gt;audit.log&lt;/code&gt;, and keeps the result in an in-memory journal.&lt;br&gt;
Every finding carries a &lt;code&gt;journalRef&lt;/code&gt; — &lt;code&gt;inspect_repo#4&lt;/code&gt;, &lt;code&gt;grep#15&lt;/code&gt; — pointing at the row in the log&lt;br&gt;
that justifies it. A score is not an opinion here; it is a queryable trail.&lt;/p&gt;

&lt;p&gt;Contents come back as &lt;code&gt;lineno|text&lt;/code&gt; rows rather than raw text. That is a deliberate prompt-engineering&lt;br&gt;
choice: models miscount lines, and if you make them count, they will confidently cite line 27 of a&lt;br&gt;
12-line file. Hand them the numbering and the citation rate goes to ~100%.&lt;/p&gt;
&lt;h2&gt;
  
  
  The five checks, and what each one actually proves
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1. &lt;code&gt;path_exists&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Pull path-shaped tokens out of harness text and glob them against the real tree. The interesting&lt;br&gt;
work is in the &lt;em&gt;filter&lt;/em&gt;, because prose is full of things that look like paths:&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;looks_like_path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;token&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;root_entries&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;set&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="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="n"&gt;raw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;`&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;raw&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;~/&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;$&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;%&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;(&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;@&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;#&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="bp"&gt;False&lt;/span&gt;
    &lt;span class="n"&gt;parts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;PurePosixPath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\\&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;/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;rstrip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&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;parts&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;parts&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="nf"&gt;any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;_is_placeholder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;parts&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="n"&gt;head&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;head&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rsplit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;URL_TLDS&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;# example.com/api is not a repo path
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;head&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;head&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;# OPENAI_API_KEY is not a directory
&lt;/span&gt;    &lt;span class="bp"&gt;...&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;COMMON_TOP_DIRS&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;head&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;root_entries&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Accept a token when it has a known extension, or when its first segment is a directory that&lt;br&gt;
actually exists at the repo root, or a conventional one (&lt;code&gt;src&lt;/code&gt;, &lt;code&gt;docs&lt;/code&gt;, &lt;code&gt;scripts&lt;/code&gt;, …). Placeholders&lt;br&gt;
(&lt;code&gt;&amp;lt;id&amp;gt;&lt;/code&gt;, &lt;code&gt;{name}&lt;/code&gt;, &lt;code&gt;path/to/…&lt;/code&gt;) are rejected — a harness that says &lt;code&gt;path/to/secret.json&lt;/code&gt; is not&lt;br&gt;
making a falsifiable claim.&lt;/p&gt;

&lt;p&gt;Globs are claims too: &lt;code&gt;src/**/*.tsx&lt;/code&gt; that matches nothing is drift, exactly as a missing file is.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. &lt;code&gt;command_runs&lt;/code&gt; — declared, never executed
&lt;/h3&gt;

&lt;p&gt;This is the check people react to, because the naive version is a security incident: you do &lt;strong&gt;not&lt;/strong&gt;&lt;br&gt;
run the commands you are auditing.&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;if&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;npm&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;pnpm&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;yarn&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;bun&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}:&lt;/span&gt;
    &lt;span class="bp"&gt;...&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;sub&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;run&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;run-script&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;rs&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}:&lt;/span&gt;
        &lt;span class="n"&gt;script&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tokens&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;sub&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;NO_DECL_SUBCOMMANDS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;          &lt;span class="c1"&gt;# install, add, exec, doctor, ...
&lt;/span&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;CommandVerdict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;script&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sub&lt;/span&gt;                          &lt;span class="c1"&gt;# `pnpm build` == `pnpm run build`
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;manifests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;declares_script&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;script&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;CommandVerdict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;close&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;difflib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_close_matches&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;script&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;manifests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;scripts&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cutoff&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.7&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;CommandVerdict&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;high&lt;/span&gt;&lt;span class="sh"&gt;"&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;Script `&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;script&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;` is not declared in package.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...,&lt;/span&gt;
        &lt;span class="n"&gt;replace&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;script&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&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;close&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Everything is a lookup against declarations the repo already makes: &lt;code&gt;package.json&lt;/code&gt; &lt;code&gt;scripts&lt;/code&gt; (across&lt;br&gt;
workspaces), &lt;code&gt;Makefile&lt;/code&gt; targets parsed with a line regex, &lt;code&gt;just&lt;/code&gt; recipes, &lt;code&gt;[project.scripts]&lt;/code&gt; entry&lt;br&gt;
points from &lt;code&gt;pyproject.toml&lt;/code&gt; via &lt;code&gt;tomllib&lt;/code&gt;, and &lt;code&gt;requirements*.txt&lt;/code&gt; / dependency tables for bare&lt;br&gt;
binaries. A binary "resolves" if it is on &lt;code&gt;PATH&lt;/code&gt; (augmented with &lt;code&gt;node_modules/.bin&lt;/code&gt;, &lt;code&gt;.venv/bin&lt;/code&gt;,&lt;br&gt;
&lt;code&gt;~/.local/bin&lt;/code&gt;, Homebrew dirs) &lt;strong&gt;or&lt;/strong&gt; declared by a manifest — because a documented tool you simply&lt;br&gt;
have not installed yet is not harness drift.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. &lt;code&gt;file_referenced&lt;/code&gt; — skills go both ways
&lt;/h3&gt;

&lt;p&gt;Two independent failures hide in a skills folder:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;declared but unused&lt;/strong&gt;: the harness names a skill, and the only mention of it anywhere in the
repo is the harness line that declares it. Nothing outside the skill's own directory references
it. That is a dead capability with a confident description.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;on disk but unlisted&lt;/strong&gt;: &lt;code&gt;.hermes/skills/orphan-skill/&lt;/code&gt; with a real &lt;code&gt;SKILL.md&lt;/code&gt; inside, and no
instruction file that mentions it. The agent cannot use what it is never told about.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The first is why the exclusion predicate matters — you must exclude the skill's own files &lt;em&gt;and&lt;/em&gt; the&lt;br&gt;
declaration line, or the check passes vacuously on every skill.&lt;/p&gt;
&lt;h3&gt;
  
  
  4. &lt;code&gt;server_reachable&lt;/code&gt; — schema plus binary, no spawning
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;.mcp.json&lt;/code&gt;, &lt;code&gt;claude_desktop_config.json&lt;/code&gt;, &lt;code&gt;.cursor/mcp.json&lt;/code&gt;, &lt;code&gt;.vscode/mcp.json&lt;/code&gt; and &lt;code&gt;opencode.json&lt;/code&gt;&lt;br&gt;
all hold server maps under slightly different keys (&lt;code&gt;mcpServers&lt;/code&gt;, &lt;code&gt;servers&lt;/code&gt;, &lt;code&gt;mcp&lt;/code&gt;). Validate the&lt;br&gt;
shape — &lt;code&gt;command&lt;/code&gt; is a non-empty string, &lt;code&gt;args&lt;/code&gt; a list of strings, &lt;code&gt;env&lt;/code&gt; an object — then resolve&lt;br&gt;
the binary. Never start the server.&lt;/p&gt;

&lt;p&gt;The diff for a dead server is the most satisfying piece of the codebase. Reparsing the JSON and&lt;br&gt;
re-dumping it would reformat the whole file; instead a small brace-matching scanner finds the exact&lt;br&gt;
line span of the member and deletes just that block, then &lt;em&gt;re-parses the result&lt;/em&gt; and refuses to&lt;br&gt;
emit the diff if the JSON would break:&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="n"&gt;patched&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;remaining&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&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;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;patched&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;ValueError&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;None&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;make_diff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&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;patched&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the dead binary has a near neighbour on &lt;code&gt;PATH&lt;/code&gt; (&lt;code&gt;node21&lt;/code&gt; → &lt;code&gt;node&lt;/code&gt;), the patch rewrites the&lt;br&gt;
command instead of deleting the server.&lt;/p&gt;
&lt;h3&gt;
  
  
  5. &lt;code&gt;semantic&lt;/code&gt; — and &lt;code&gt;unknown&lt;/code&gt; as a real answer
&lt;/h3&gt;

&lt;p&gt;Conventions are the hard part, so they get two engines. A mechanical subset is checkable without a&lt;br&gt;
model: &lt;em&gt;never use &lt;code&gt;X&lt;/code&gt;&lt;/em&gt;, &lt;em&gt;use &lt;code&gt;A&lt;/code&gt; instead of &lt;code&gt;B&lt;/code&gt;&lt;/em&gt;, &lt;em&gt;every unit must contain &lt;code&gt;file.ext&lt;/code&gt;&lt;/em&gt;. Grep the&lt;br&gt;
token through source files, skipping comments and docs — a README that quotes an anti-pattern to&lt;br&gt;
tell you not to write it is not a violation.&lt;/p&gt;

&lt;p&gt;Everything else goes to the model, with a strict contract:&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="nl"&gt;"verdicts"&lt;/span&gt;&lt;span class="p"&gt;:[{&lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"r7"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"verdict"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"holds|violated|unknown"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"evidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;path:line + quote&amp;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 then the answer is audited too. If a &lt;code&gt;violated&lt;/code&gt; verdict cites a path that does not exist in the&lt;br&gt;
repo, it is downgraded to &lt;code&gt;unknown&lt;/code&gt; and the unverified citation is kept on the finding. &lt;code&gt;unknown&lt;/code&gt;&lt;br&gt;
costs 1 point and is always displayed. A tool that hides its uncertainty is a tool that will&lt;br&gt;
eventually hide a violation.&lt;/p&gt;

&lt;p&gt;No key configured? The section reports &lt;code&gt;skipped: no_api_key&lt;/code&gt; — as a row in the findings table, not a&lt;br&gt;
silent gap. Checks 1–4 still run, which is where most real drift lives anyway.&lt;/p&gt;
&lt;h2&gt;
  
  
  Scoring you can defend
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;BASE_SCORE&lt;/span&gt;                    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
&lt;span class="n"&gt;PENALTY_DETERMINISTIC_FAILURE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;
&lt;span class="n"&gt;PENALTY_SEMANTIC_VIOLATION&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="n"&gt;PENALTY_SEMANTIC_UNKNOWN&lt;/span&gt;      &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="n"&gt;MAX_PENALTY_PER_CATEGORY&lt;/span&gt;      &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;
&lt;span class="n"&gt;CATEGORIES&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;paths&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;commands&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;skills&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;mcp&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;conventions&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;category_penalty&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;categories&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The per-category cap exists because a 500-path repo with one renamed directory should not score 0.&lt;br&gt;
Four deterministic failures saturate a category, and the UI says &lt;code&gt;capped&lt;/code&gt; when it happens.&lt;/p&gt;

&lt;p&gt;The constants are served by &lt;code&gt;GET /api/scoring&lt;/code&gt; and rendered in an expandable "how this score was&lt;br&gt;
computed" panel, so nobody has to trust the number.&lt;/p&gt;
&lt;h2&gt;
  
  
  The two bugs that actually taught me something
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;lstrip("./")&lt;/code&gt; is not "strip a leading &lt;code&gt;./&lt;/code&gt;".&lt;/strong&gt; It strips any leading character in the set&lt;br&gt;
&lt;code&gt;{'.', '/'}&lt;/code&gt; — so the pattern &lt;code&gt;.mcp.json&lt;/code&gt; silently became &lt;code&gt;mcp.json&lt;/code&gt;, and every dotted harness file&lt;br&gt;
(&lt;code&gt;.mcp.json&lt;/code&gt;, &lt;code&gt;.cursorrules&lt;/code&gt;, &lt;code&gt;.hermes/skills/**&lt;/code&gt;, &lt;code&gt;.claude/…&lt;/code&gt;) was invisible to discovery. The&lt;br&gt;
symptom was a clean-looking audit of a repo with a broken MCP config. The fix is a loop:&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;while&lt;/span&gt; &lt;span class="n"&gt;norm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&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;norm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;norm&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Worse than the MCP miss: &lt;code&gt;inspect_repo(".eslintrc.json")&lt;/code&gt; returned "does not exist", so the auditor&lt;br&gt;
would have &lt;em&gt;confidently reported a false finding&lt;/em&gt;. A byte-cap or a regex bug is visible; a&lt;br&gt;
path-normalisation bug manufactures evidence. That is the one class of bug this project cannot&lt;br&gt;
afford.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A diff is a claim too.&lt;/strong&gt; My first stale-path patch deleted the whole harness line. For&lt;br&gt;
&lt;code&gt;- Edit \&lt;/code&gt;src/old.ts&lt;code&gt;when the CLI output changes.&lt;/code&gt; that is right. For&lt;br&gt;
&lt;code&gt;Read \&lt;/code&gt;README.md&lt;code&gt;first, then \&lt;/code&gt;docs/architecture.md&lt;code&gt;.&lt;/code&gt; it deletes a valid instruction along with&lt;br&gt;
the stale one. So: if the line carries other checkable claims, excise only the stale token — which&lt;br&gt;
means tidying the residue (&lt;code&gt;… first, then .&lt;/code&gt; → &lt;code&gt;… first.&lt;/code&gt;) with a small chain of regexes, and&lt;br&gt;
falling back to deleting the line when nothing checkable survives.&lt;/p&gt;

&lt;p&gt;And a rename is only proposed when the file name is unchanged (a move) or the two paths are ≥0.86&lt;br&gt;
similar. Anything looser goes in the &lt;code&gt;suggestion&lt;/code&gt; field, not in a diff. &lt;code&gt;src/cli.ts&lt;/code&gt; → &lt;code&gt;src/util.ts&lt;/code&gt;&lt;br&gt;
is a plausible-looking patch that would be wrong, and a wrong patch is worse than no patch.&lt;/p&gt;
&lt;h2&gt;
  
  
  Precision: the audit of the audit
&lt;/h2&gt;

&lt;p&gt;Luthier's first run against a real repo scored 42 and flagged &lt;code&gt;src/old.ts&lt;/code&gt; — a path that repo's&lt;br&gt;
README quotes as &lt;em&gt;an example of drift&lt;/em&gt;. Technically a true observation; practically noise, and&lt;br&gt;
noise in a score is how you lose people's trust in one edit.&lt;/p&gt;

&lt;p&gt;Two rules fixed most of it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;A file the docs say the app &lt;em&gt;writes&lt;/em&gt; is not a broken reference.&lt;/strong&gt; &lt;code&gt;"stored in
run/settings.local.json (mode 0600)"&lt;/code&gt; describes run-time behaviour. Advisory, 0 points.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prose docs naming a path inside a directory this repo does not have are probably examples.&lt;/strong&gt;
&lt;code&gt;README.md&lt;/code&gt; quoting &lt;code&gt;src/foo.ts&lt;/code&gt; in a repo with no &lt;code&gt;src/&lt;/code&gt; at all → advisory. But &lt;code&gt;CLAUDE.md&lt;/code&gt;
quoting it → still a hard failure, because an instruction file is what the agent loads and
obeys.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That distinction — &lt;em&gt;instruction files are charged, docs are surfaced&lt;/em&gt; — is the whole difference&lt;br&gt;
between a score people act on and a lint report nobody reads. The same repo went 42 → 76 with the&lt;br&gt;
genuinely real findings still listed.&lt;/p&gt;
&lt;h2&gt;
  
  
  Verification
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run verify     &lt;span class="c"&gt;# python -m agent.verify&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Two throwaway git repos are written to a temp dir. One has five kinds of seeded drift; every one&lt;br&gt;
must be flagged at the correct &lt;code&gt;file:line&lt;/code&gt;. The other must score ≥95 with zero deterministic&lt;br&gt;
failures — the guard against a checker that flags everything, which is easy to write and worthless.&lt;br&gt;
Then every generated diff is run through &lt;code&gt;git apply --check&lt;/code&gt;, every citation must be a real line in&lt;br&gt;
a real file, and &lt;code&gt;audit.log&lt;/code&gt; must be valid JSONL with tool, args, duration and bytes on every row.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;drifted fixture  score  47  findings  9  rules  9  tool calls 15
clean fixture    score 100  findings  0  rules  4

30 passed, 0 failed
PASS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Strands agent loop gets its own check (&lt;code&gt;scripts/agent_loop_check.py&lt;/code&gt;) against a local mock&lt;br&gt;
OpenAI-compatible endpoint, asserting the agent's tool call really travelled through the journaled&lt;br&gt;
reader and that the API key never appears in a response body. It proves the integration, not the&lt;br&gt;
model's judgement — and it is honest about that distinction, because a claim about the second kind&lt;br&gt;
would be exactly the thing this tool exists to catch.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it's for
&lt;/h2&gt;

&lt;p&gt;Not lint. Lint checks that code satisfies a style. Luthier checks that &lt;em&gt;instructions satisfy&lt;br&gt;
reality&lt;/em&gt; — a different axis, and the one nobody automated yet.&lt;/p&gt;

&lt;p&gt;The uncomfortable framing: a harness is a prompt, a prompt is a dependency, and we have no&lt;br&gt;
dependency checker for prompts. We have this instead — a scorecard that says, in one number and a&lt;br&gt;
table of quotes, how much of what you tell your agent is still true.&lt;/p&gt;

&lt;p&gt;Run it against your repo. If the number is high, the interesting question is whether your harness&lt;br&gt;
has been edited recently enough to have had the chance to rot.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Stack:&lt;/strong&gt; Strands Agents 1.57 (agent loop, &lt;code&gt;@tool&lt;/code&gt;), FastAPI + uvicorn, httpx for plain OpenAI-compatible chat calls, Vite + React 18 + TypeScript + Tailwind, &lt;code&gt;difflib&lt;/code&gt; for the patches, &lt;code&gt;git apply --check&lt;/code&gt; as the diff gate. Python 3.11+, no network from the checks, no writes to the&lt;br&gt;
audited repo.&lt;/p&gt;

&lt;p&gt;Code &amp;amp; more: &lt;a href="https://www.dailybuild.xyz/project/271-luthier" rel="noopener noreferrer"&gt;https://www.dailybuild.xyz/project/271-luthier&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>programming</category>
      <category>dailybuild2026</category>
    </item>
    <item>
      <title>How to Handle Edge Cases in TTS Applications</title>
      <dc:creator>VoiceDeveloper</dc:creator>
      <pubDate>Fri, 02 Oct 2026 18:12:57 +0000</pubDate>
      <link>https://dev.to/voice_developer/how-to-handle-edge-cases-in-tts-applications-11pa</link>
      <guid>https://dev.to/voice_developer/how-to-handle-edge-cases-in-tts-applications-11pa</guid>
      <description>&lt;h2&gt;
  
  
  Common Edge Cases in TTS
&lt;/h2&gt;

&lt;p&gt;When you’re building a voice‑first product, the first thing you’ll notice is that the “normal” text you feed into a TTS engine is rarely normal. Think about product names, acronyms, URLs, emojis, or user‑generated content that can throw the synthesizer off its groove. If you don’t anticipate these quirks, your users will hear garbled speech, wrong pronunciations, or, worse, a voice that sounds like it’s from a different person.&lt;/p&gt;

&lt;p&gt;Below we walk through the most frequent edge cases, how to tackle them, and some practical code snippets to get you up and running quickly. All of this is framed around the modern, developer‑friendly TTS platform &lt;strong&gt;ElevenLabs&lt;/strong&gt; – a great place to start if you want high‑quality, customizable voices.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Non‑Standard Punctuation &amp;amp; Symbols
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Problem
&lt;/h3&gt;

&lt;p&gt;Punctuation like &lt;code&gt;—&lt;/code&gt;, &lt;code&gt;…&lt;/code&gt;, or emojis can be interpreted literally (e.g., “dash” or “ellipsis”) or cause a pause that feels unnatural.&lt;/p&gt;

&lt;h3&gt;
  
  
  Solution
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Strip or replace uncommon punctuation before synthesis.&lt;/li&gt;
&lt;li&gt;Use SSML &lt;code&gt;&amp;lt;break&amp;gt;&lt;/code&gt; tags to control pauses.&lt;/li&gt;
&lt;li&gt;Map emojis to descriptive text.
&lt;/li&gt;
&lt;/ul&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;re&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;sanitize_text&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="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# Replace em-dash with regular dash
&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="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;—&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;-&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# Replace ellipsis with three periods
&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="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;…&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;...&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# Map common emojis to words
&lt;/span&gt;    &lt;span class="n"&gt;emoji_map&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;😀&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;smile&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;🚀&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;rocket&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;emo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;emoji_map&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&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="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;emo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# Remove any remaining non‑ASCII characters
&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;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;[^\x00-\x7F]+&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;text&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;text&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  2. Acronyms &amp;amp; Initialisms
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Problem
&lt;/h3&gt;

&lt;p&gt;Acronyms like &lt;code&gt;NASA&lt;/code&gt; or &lt;code&gt;HTML&lt;/code&gt; are often pronounced as individual letters, which can be confusing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Solution
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Provide a custom pronunciation dictionary.&lt;/li&gt;
&lt;li&gt;Use SSML &lt;code&gt;&amp;lt;sub&amp;gt;&lt;/code&gt; tags to spell out acronyms.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;sub&lt;/span&gt; &lt;span class="na"&gt;alias=&lt;/span&gt;&lt;span class="s"&gt;"NASA"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;NASA&lt;span class="nt"&gt;&amp;lt;/sub&amp;gt;&lt;/span&gt; launched a new satellite.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you’re using ElevenLabs’ API, you can pass the &lt;code&gt;pronunciation&lt;/code&gt; field:&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;"NASA launched a new satellite."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"pronunciation"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="nl"&gt;"NASA"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"na-sah"&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;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;h2&gt;
  
  
  3. Numbers &amp;amp; Dates
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Problem
&lt;/h3&gt;

&lt;p&gt;Numbers can be read as digits (&lt;code&gt;1 2 3&lt;/code&gt;) or as words (&lt;code&gt;one hundred twenty‑three&lt;/code&gt;). Dates can be misinterpreted (&lt;code&gt;12/10/23&lt;/code&gt; → “twelve over ten over twenty‑three” vs. “December tenth, twenty‑three”).&lt;/p&gt;

&lt;h3&gt;
  
  
  Solution
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Convert numbers to words using a library like &lt;code&gt;num2words&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Use SSML &lt;code&gt;&amp;lt;say-as&amp;gt;&lt;/code&gt; tags to specify format.
&lt;/li&gt;
&lt;/ul&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;num2words&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;num2words&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;format_numbers&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="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# Very naive example: replace digits with words
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;\d+&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;num2words&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;group&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;SSML example for dates:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;say-as&lt;/span&gt; &lt;span class="na"&gt;interpret-as=&lt;/span&gt;&lt;span class="s"&gt;"date"&lt;/span&gt; &lt;span class="na"&gt;format=&lt;/span&gt;&lt;span class="s"&gt;"mdy"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;12/10/23&lt;span class="nt"&gt;&amp;lt;/say-as&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4. Non‑English Content
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Problem
&lt;/h3&gt;

&lt;p&gt;Mixed‑language input can cause the engine to default to the wrong language model.&lt;/p&gt;

&lt;h3&gt;
  
  
  Solution
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Detect language using &lt;code&gt;langdetect&lt;/code&gt; and route to the correct voice.&lt;/li&gt;
&lt;li&gt;For short foreign phrases, use SSML &lt;code&gt;&amp;lt;lang&amp;gt;&lt;/code&gt; tags.
&lt;/li&gt;
&lt;/ul&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;langdetect&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;detect&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;detect_and_route&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;lang&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;detect&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="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;lang&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;en&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&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;en-US&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;lang&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;es&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&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;es-ES&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
    &lt;span class="c1"&gt;# ... more voices
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;voice&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  5. Custom Voice Cloning
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Problem
&lt;/h3&gt;

&lt;p&gt;Standard voices may not match your brand’s tone or the user’s preference.&lt;/p&gt;

&lt;h3&gt;
  
  
  Solution
&lt;/h3&gt;

&lt;p&gt;ElevenLabs offers a straightforward voice cloning workflow. Create a “voice profile” by uploading a short audio clip and letting the model learn your unique timbre. You can then pass the &lt;code&gt;voice_id&lt;/code&gt; to the API.&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="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="n"&gt;API_KEY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;YOUR_ELEVENLABS_API_KEY&lt;/span&gt;&lt;span class="sh"&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="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;your-cloned-voice-id&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;

&lt;span class="n"&gt;headers&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;accept&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;application/json&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;xi-api-key&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;API_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;content-type&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;application/json&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;data&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;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="s"&gt;Welcome to our brand‑new feature!&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;voice_id&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="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;response&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;https://api.elevenlabs.io/v1/text-to-speech&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&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="n"&gt;data&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;output.mp3&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;wb&lt;/span&gt;&lt;span class="sh"&gt;'&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;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip&lt;/strong&gt; – When cloning, keep the recording short (≈30 s) and clear. Background noise hurts the model’s accuracy.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  6. Emotion &amp;amp; Prosody Control
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Problem
&lt;/h3&gt;

&lt;p&gt;A monotonous voice can make your app feel robotic. But too much emphasis can sound forced.&lt;/p&gt;

&lt;h3&gt;
  
  
  Solution
&lt;/h3&gt;

&lt;p&gt;ElevenLabs lets you tweak prosody and emotion via SSML or by setting the &lt;code&gt;style&lt;/code&gt; parameter.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;prosody&lt;/span&gt; &lt;span class="na"&gt;rate=&lt;/span&gt;&lt;span class="s"&gt;"95%"&lt;/span&gt; &lt;span class="na"&gt;pitch=&lt;/span&gt;&lt;span class="s"&gt;"10%"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Hello, world!&lt;span class="nt"&gt;&amp;lt;/prosody&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or via the API:&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;"Hello, world!"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"style"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cheerful"&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;Experiment with &lt;code&gt;style&lt;/code&gt; options like &lt;code&gt;serious&lt;/code&gt;, &lt;code&gt;excited&lt;/code&gt;, or &lt;code&gt;calm&lt;/code&gt; to match your brand voice.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Handling User‑Generated Content
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Problem
&lt;/h3&gt;

&lt;p&gt;User comments or reviews can contain slang, misspellings, or even profanity.&lt;/p&gt;

&lt;h3&gt;
  
  
  Solution
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Sanitize&lt;/strong&gt;: Strip profanity using a whitelist or a third‑party library.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Normalize&lt;/strong&gt;: Use a spell‑checker to fix common typos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fallback&lt;/strong&gt;: If a phrase cannot be reliably processed, fallback to a default voice or skip TTS for that segment.
&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;import&lt;/span&gt; &lt;span class="n"&gt;profanity_filter&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;clean_user_text&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="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&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;profanity_filter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sanitize&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  8. Testing &amp;amp; QA
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Automated Unit Tests
&lt;/h3&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;test_sanitize_text&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;raw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello—world…😀&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;cleaned&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sanitize_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;—&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;cleaned&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;…&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;cleaned&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;😀&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;cleaned&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  End‑to‑End Pipeline
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Input&lt;/strong&gt; → Sanitization → Language Detection → Voice Selection → SSML Generation → ElevenLabs API → MP3 → Playback.&lt;/li&gt;
&lt;li&gt;Log each step; if the API returns an error, surface a human‑readable message.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  9. Deployment Considerations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rate Limits&lt;/strong&gt; – ElevenLabs enforces limits per minute. Cache frequently used sentences or pre‑generate static audio where possible.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Latency&lt;/strong&gt; – Use asynchronous calls or a queue system (e.g., RabbitMQ) to keep UI responsive.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Storage&lt;/strong&gt; – Store generated MP3s in a CDN or object store for quick retrieval.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  10. Wrap‑Up
&lt;/h2&gt;

&lt;p&gt;Edge cases in TTS aren’t just bugs; they’re opportunities to polish the user experience. By sanitizing input, handling special formats, and leveraging the flexibility of services like &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;), you can create a voice layer that feels natural, trustworthy, and uniquely yours.&lt;/p&gt;




&lt;h3&gt;
  
  
  Next Steps
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Try ElevenLabs&lt;/strong&gt; – Sign up using the link above and experiment with cloning a voice from your own recordings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integrate&lt;/strong&gt; – Plug the snippets into your existing pipeline and watch the quality jump.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Iterate&lt;/strong&gt; – Add more SSML tags, fine‑tune styles, and gather user feedback.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Give ElevenLabs a spin today and transform how your users hear your content. Happy coding!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
      <category>webdev</category>
    </item>
    <item>
      <title>OpenCoach: a Sanity Context agent that reconciles outdated docs with live code</title>
      <dc:creator>Marcelo Rodrigues</dc:creator>
      <pubDate>Fri, 02 Oct 2026 18:09:39 +0000</pubDate>
      <link>https://dev.to/marcelo_rodrigues_53/opencoach-a-sanity-context-agent-that-reconciles-outdated-docs-with-live-code-555h</link>
      <guid>https://dev.to/marcelo_rodrigues_53/opencoach-a-sanity-context-agent-that-reconciles-outdated-docs-with-live-code-555h</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;OpenCoach is a question-answering agent for the architecture and business rules of an order-processing system. It helps a developer answer questions such as “How does the dead-letter queue work?” with evidence from structured, source-linked knowledge rather than a plausible but unverified summary.&lt;/p&gt;

&lt;p&gt;The problem is especially visible when documentation ages: an earlier diagnostic said retry and a DLQ still needed to be implemented, while the current Go code declares dead-letter exchanges and queues and rejects failed messages without requeueing. I modeled both claims, their status, and their sources in Sanity so the agent can distinguish historical advice from current behavior. That is more useful than treating all matching text as equally current.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;pre-existing Go orders/payments application is the foundation, not the contest entry itself&lt;/strong&gt;. I began that repository before this challenge. During the challenge I added the Sanity Studio schemas and seed content, connected OpenCoach to a Sanity Context Knowledge Base over MCP, and added the grounded-answer interface. The existing local RAG mode remains available as a separate mode.&lt;/p&gt;

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

&lt;p&gt;Try the &lt;a href="https://frontend-phi-ten-75.vercel.app" rel="noopener noreferrer"&gt;live OpenCoach demo&lt;/a&gt;: open &lt;strong&gt;OpenCoach&lt;/strong&gt;, enter &lt;strong&gt;“Como funciona a DLQ?”&lt;/strong&gt; (“How does the DLQ work?”), then click &lt;strong&gt;Buscar evidências&lt;/strong&gt;. The response shows the Sanity Context mode and the Knowledge Base evidence it used. This exact question was tested against the deployed app.&lt;/p&gt;

&lt;p&gt;No login is required for the demo. The backend runs on a free hosting tier and may need time to wake after inactivity. If an upstream model request briefly returns 503, wait and try again.&lt;/p&gt;

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

&lt;p&gt;The &lt;a href="https://github.com/MarceloRodrigues1853/ada_go-desafio_pedidos" rel="noopener noreferrer"&gt;open-source repository&lt;/a&gt; contains the Go application and the contest additions. The &lt;a href="https://github.com/MarceloRodrigues1853/ada_go-desafio_pedidos/pull/1" rel="noopener noreferrer"&gt;Sanity integration pull request&lt;/a&gt; makes the new work and its history easy to inspect. The main integration points are &lt;code&gt;sanity/schemaTypes/&lt;/code&gt;, &lt;code&gt;sanity/seed/&lt;/code&gt;, &lt;code&gt;open_coach.py&lt;/code&gt;, &lt;code&gt;rag_api.py&lt;/code&gt;, and &lt;code&gt;frontend/src/App.tsx&lt;/code&gt;.&lt;/p&gt;

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

&lt;p&gt;I created a Sanity Studio for technical knowledge, not customer or order records. Five document types model business rules, architecture decisions, domain events, API endpoints, and documentation claims. The content records code-file evidence and distinguishes current claims from outdated ones. A historical DLQ claim explicitly references the current claim it conflicts with.&lt;/p&gt;

&lt;p&gt;I seeded the Studio from facts checked against the repository code and used those documents to build a Sanity Context Knowledge Base. At question time, the OpenCoach backend calls the Context MCP &lt;code&gt;initial_context&lt;/code&gt; tool for the Knowledge Base outline. A Gemini routing step selects relevant entry paths; the backend reads those entries with &lt;code&gt;knowledge_base_read&lt;/code&gt;; and a second step generates the answer from the retrieved entries. The UI exposes the answer and the evidence so a reader can inspect the basis for it.&lt;/p&gt;

&lt;p&gt;This structure is central to the use case: the agent needs to know whether a claim is current or historical, what code supports it, and which claims conflict. A plain keyword match on “DLQ” would retrieve both old and new statements without resolving their status.&lt;/p&gt;

&lt;p&gt;One limitation remains transparent: in a generated DLQ Knowledge Base entry, two citation markers about metrics and monitoring point to the current-DLQ claim rather than the architecture-decision source that actually documents those details. The source-card mismatch is recorded in &lt;a href="https://github.com/MarceloRodrigues1853/ada_go-desafio_pedidos/blob/main/sanity/README.md" rel="noopener noreferrer"&gt;&lt;code&gt;sanity/README.md&lt;/code&gt;&lt;/a&gt;. The presence and basic behavior of the DLQ were checked against code, but these two citation markers still need human review; “entries up to date” does not mean every generated citation is correct.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Sanity project ID: &lt;code&gt;ss56mini&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Dataset: &lt;code&gt;production&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Knowledge Base ID: &lt;code&gt;kbbKnMXYLs6b&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Studio schemas and seed content: &lt;a href="https://github.com/MarceloRodrigues1853/ada_go-desafio_pedidos/tree/main/sanity" rel="noopener noreferrer"&gt;&lt;code&gt;sanity/&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The MCP access token stays on the backend and is not published with the demo or repository.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>sanitychallenge</category>
      <category>sanity</category>
      <category>ai</category>
    </item>
    <item>
      <title>AI Agency Framework: AI’s Effect on Society, Jobs, Tools, and Culture</title>
      <dc:creator>AI Agency Framework</dc:creator>
      <pubDate>Fri, 02 Oct 2026 18:08:22 +0000</pubDate>
      <link>https://dev.to/devworkflowlab/ai-agency-framework-ais-effect-on-society-jobs-tools-and-culture-5ahn</link>
      <guid>https://dev.to/devworkflowlab/ai-agency-framework-ais-effect-on-society-jobs-tools-and-culture-5ahn</guid>
      <description>&lt;p&gt;AI Agency Framework — clear explainers on AI’s effect on society, jobs, tools, and culture.&lt;/p&gt;

&lt;p&gt;Explore the framework: &lt;a href="https://aiagencyframework.org/" rel="noopener noreferrer"&gt;https://aiagencyframework.org/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
    </item>
    <item>
      <title>Why Every App Will Have Voice AI by 2028</title>
      <dc:creator>VoiceDeveloper</dc:creator>
      <pubDate>Fri, 02 Oct 2026 18:07:42 +0000</pubDate>
      <link>https://dev.to/voice_developer/why-every-app-will-have-voice-ai-by-2028-3f3e</link>
      <guid>https://dev.to/voice_developer/why-every-app-will-have-voice-ai-by-2028-3f3e</guid>
      <description>&lt;h2&gt;
  
  
  The Voice AI Wave: Why Every App Will Have Voice by 2028
&lt;/h2&gt;

&lt;p&gt;If you’ve been building mobile or web products for the last few years, you’ve probably noticed a subtle but steady shift: &lt;strong&gt;voice is becoming a first‑class interface&lt;/strong&gt;. From smart assistants that sit on your nightstand to in‑app audio guides that read out long‑form content, developers are adding spoken interaction almost as reflexively as they add a button or a swipe gesture.&lt;/p&gt;

&lt;p&gt;So why are we convinced that &lt;strong&gt;every app will ship with Voice AI by 2028&lt;/strong&gt;? Let’s break down the three forces that are pushing us toward that future, and then dive into a practical example of how you can get started today using the &lt;strong&gt;ElevenLabs&lt;/strong&gt; platform (yes, the same service that powers many of the most natural‑sounding text‑to‑speech experiences on the market).&lt;/p&gt;




&lt;h2&gt;
  
  
  1. The Maturation of Text‑to‑Speech (TTS) Engines
&lt;/h2&gt;

&lt;p&gt;A decade ago, TTS sounded robotic—think “Welcome to the system, please press one.” Modern neural TTS models now generate speech that carries &lt;strong&gt;intonation, emotion, and even speaker‑specific quirks&lt;/strong&gt;. The underlying technology has moved from concatenative synthesis (stitching together pre‑recorded phonemes) to deep learning models that predict raw waveforms directly.&lt;/p&gt;

&lt;p&gt;Key milestones:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Year&lt;/th&gt;
&lt;th&gt;Breakthrough&lt;/th&gt;
&lt;th&gt;Impact&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2017&lt;/td&gt;
&lt;td&gt;WaveNet (DeepMind)&lt;/td&gt;
&lt;td&gt;Human‑like prosody&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2020&lt;/td&gt;
&lt;td&gt;FastSpeech 2&lt;/td&gt;
&lt;td&gt;Real‑time generation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2022&lt;/td&gt;
&lt;td&gt;Voice cloning APIs&lt;/td&gt;
&lt;td&gt;Custom voice avatars on demand&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;Multi‑language zero‑shot TTS&lt;/td&gt;
&lt;td&gt;One model, dozens of languages&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Because the latency is now measured in milliseconds and the cost per generated minute has dropped to pennies, integrating TTS is no longer a “nice‑to‑have” luxury—it’s a &lt;strong&gt;cost‑effective baseline&lt;/strong&gt; for accessibility, localization, and user engagement.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Voice Cloning Makes Personalization Scalable
&lt;/h2&gt;

&lt;p&gt;Imagine a fitness app that greets each user by name, using &lt;em&gt;their own&lt;/em&gt; voice. Or an e‑learning platform where the instructor’s tone matches the learner’s preferred accent. Voice cloning—training a model on a few seconds of audio to reproduce a specific voice—makes that possible.&lt;/p&gt;

&lt;p&gt;Why does cloning matter for developers?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Brand Consistency&lt;/strong&gt; – Companies can create a unique brand voice without hiring a full‑time voice actor.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;User‑Generated Content&lt;/strong&gt; – Apps can let users upload a short sample and instantly generate personalized audio replies.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accessibility&lt;/strong&gt; – People with speech impairments can have their own voice synthesized for communication tools.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The barrier to entry has collapsed: modern APIs expose cloning with just a few HTTP calls, handling the heavy lifting of model training behind the scenes.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Platform Integration Becomes Plug‑and‑Play
&lt;/h2&gt;

&lt;p&gt;All major cloud providers now offer &lt;strong&gt;managed voice services&lt;/strong&gt; that integrate with serverless functions, mobile SDKs, and CI pipelines. The workflow looks like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Collect text&lt;/strong&gt; (e.g., a news article, a chatbot response).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Call a TTS endpoint&lt;/strong&gt; (provide language, voice ID, style).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stream the audio&lt;/strong&gt; back to the client or store it in a CDN.
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Because the API surface is uniform, you can swap providers, experiment with voices, and even A/B test different speech styles without rewriting core business logic.&lt;/p&gt;




&lt;h2&gt;
  
  
  Getting Your Hands Dirty: A Quick ElevenLabs Demo
&lt;/h2&gt;

&lt;p&gt;ElevenLabs offers one of the most natural‑sounding neural TTS engines on the market, plus a straightforward voice cloning endpoint. Below is a minimal example that shows how to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generate speech from plain text
&lt;/li&gt;
&lt;li&gt;Use a cloned voice (once you’ve uploaded a sample)
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Feel free to copy‑paste this into a fresh Python virtual environment.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create a venv (optional but recommended)&lt;/span&gt;
python &lt;span class="nt"&gt;-m&lt;/span&gt; venv venv
&lt;span class="nb"&gt;source &lt;/span&gt;venv/bin/activate  &lt;span class="c"&gt;# on Windows: venv\Scripts\activate&lt;/span&gt;

&lt;span class="c"&gt;# Install the HTTP client&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;requests
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  1️⃣ Generate Speech with a Default Voice
&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;requests&lt;/span&gt;

&lt;span class="n"&gt;API_KEY&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_ELEVENLABS_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.elevenlabs.io/v1/text-to-speech/EXAMPLE_VOICE_ID&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;payload&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;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="s"&gt;Welcome to the future of voice AI. Your app just got a lot smarter!&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;model_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;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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;voice_settings&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&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;stability&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.75&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;similarity_boost&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.85&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;headers&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;xi-api-key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;API_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-Type&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;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;response&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="n"&gt;url&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="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Save the audio file
&lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;welcome.mp3&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;wb&lt;/span&gt;&lt;span class="sh"&gt;"&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;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Audio saved as welcome.mp3&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;Replace &lt;code&gt;EXAMPLE_VOICE_ID&lt;/code&gt; with any of the public voice IDs listed in the ElevenLabs docs. The &lt;code&gt;stability&lt;/code&gt; and &lt;code&gt;similarity_boost&lt;/code&gt; parameters let you fine‑tune the prosody to match your app’s personality.&lt;/p&gt;

&lt;h3&gt;
  
  
  2️⃣ Clone a Custom Voice
&lt;/h3&gt;

&lt;p&gt;First, upload a short (≈30 s) sample of the target speaker. You can do this via the web console or a simple &lt;code&gt;curl&lt;/code&gt; call:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"https://api.elevenlabs.io/v1/voices/add"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"xi-api-key: YOUR_ELEVENLABS_API_KEY"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-F&lt;/span&gt; &lt;span class="s2"&gt;"name=MyCustomVoice"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-F&lt;/span&gt; &lt;span class="s2"&gt;"files=@/path/to/sample.wav"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The response contains a new &lt;code&gt;voice_id&lt;/code&gt;. Use that ID in the TTS request:&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="n"&gt;custom_voice_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_CUSTOM_VOICE_ID&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&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;https://api.elevenlabs.io/v1/text-to-speech/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;custom_voice_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;response&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="n"&gt;url&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="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;custom_greeting.mp3&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;wb&lt;/span&gt;&lt;span class="sh"&gt;"&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;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Custom voice audio saved as custom_greeting.mp3&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;That’s it—your app now speaks &lt;strong&gt;with a brand‑new, user‑specific voice&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  3️⃣ Front‑End Integration (JavaScript)
&lt;/h3&gt;

&lt;p&gt;If you’re building a web app, you can stream the audio directly to the browser:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;speak&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;voiceId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`https://api.elevenlabs.io/v1/text-to-speech/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;voiceId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;xi-api-key&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;YOUR_ELEVENLABS_API_KEY&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;model_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;eleven_monolingual_v1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;voice_settings&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;stability&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;similarity_boost&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.9&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;blob&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;blob&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createObjectURL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;blob&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;audio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Audio&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;audio&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="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Example usage&lt;/span&gt;
&lt;span class="nf"&gt;speak&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hey there, welcome back!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;EXAMPLE_VOICE_ID&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With just a few lines, you’ve turned any string into a spoken phrase that can be played back instantly.&lt;/p&gt;




&lt;h2&gt;
  
  
  Real‑World Scenarios Where Voice AI Becomes Mandatory
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Domain&lt;/th&gt;
&lt;th&gt;Why Voice Matters&lt;/th&gt;
&lt;th&gt;Example Use‑Case&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;E‑commerce&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Hands‑free browsing while cooking, driving, or exercising&lt;/td&gt;
&lt;td&gt;“Hey app, read me the top‑rated reviews for the blender.”&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Healthcare&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Accessibility for patients with limited motor control&lt;/td&gt;
&lt;td&gt;Medication reminders spoken in a calming, familiar voice.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Education&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Multilingual narration for global classrooms&lt;/td&gt;
&lt;td&gt;Auto‑translate a lecture and deliver it in the student’s native accent.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Gaming&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dynamic NPC dialogue that adapts to player choices&lt;/td&gt;
&lt;td&gt;Clone the voice of a player’s character for in‑game narration.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;FinTech&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Secure, voice‑based verification and transaction summaries&lt;/td&gt;
&lt;td&gt;“Your balance is $4,321. Would you like to transfer $200?”&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In each of these, the &lt;strong&gt;cost of not having voice&lt;/strong&gt; is higher friction, lower retention, or missed accessibility compliance.&lt;/p&gt;




&lt;h2&gt;
  
  
  Preparing Your Stack for Voice‑First Development
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Design for Latency&lt;/strong&gt; – Even with fast neural models, network round‑trip adds ~150 ms. Cache frequently used phrases or pre‑generate audio for static content.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Handle Audio Formats&lt;/strong&gt; – MP3 is universally supported, but consider OGG or AAC for lower bitrate when bandwidth is tight.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Secure Your API Keys&lt;/strong&gt; – Store keys in environment variables or secret managers; never embed them in client‑side code.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitor Costs&lt;/strong&gt; – Most providers bill per generated minute. Set alerts once you cross a threshold, especially if you enable user‑generated cloning.
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  The Bottom Line
&lt;/h2&gt;

&lt;p&gt;Voice AI is moving from a &lt;strong&gt;novelty&lt;/strong&gt; to a &lt;strong&gt;necessity&lt;/strong&gt;. The technology is affordable, the APIs are developer‑friendly, and the user expectations are rising fast. By 2028, any product that wants to stay competitive will need to speak—literally.&lt;/p&gt;

&lt;p&gt;If you’re ready to add that conversational sparkle to your app, &lt;strong&gt;ElevenLabs&lt;/strong&gt; offers a powerful, easy‑to‑integrate platform for both high‑quality TTS and voice cloning. Their API is well‑documented, and the pricing tier for developers is generous enough to let you experiment without breaking the bank.&lt;/p&gt;




&lt;h3&gt;
  
  
  👉 Ready to give your app a voice?
&lt;/h3&gt;

&lt;p&gt;Start building today with ElevenLabs and see how natural‑sounding speech can transform your user experience. Grab your free trial here: &lt;strong&gt;&lt;a href="https://try.elevenlabs.io/kr07zfuqn1bp" rel="noopener noreferrer"&gt;https://try.elevenlabs.io/kr07zfuqn1bp&lt;/a&gt;&lt;/strong&gt;. Happy coding—and happy listening!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>discuss</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Build an AI Shopping Agent That Knows What a Deal Costs</title>
      <dc:creator>bot bot</dc:creator>
      <pubDate>Fri, 02 Oct 2026 18:05:22 +0000</pubDate>
      <link>https://dev.to/kirothebot/build-an-ai-shopping-agent-that-knows-what-a-deal-costs-59ga</link>
      <guid>https://dev.to/kirothebot/build-an-ai-shopping-agent-that-knows-what-a-deal-costs-59ga</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://forgemesh.io/blog/build-ai-shopping-agent-mcp-shopscout?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=build-ai-shopping-agent-mcp-shopscout" rel="noopener noreferrer"&gt;ForgeMesh&lt;/a&gt;.&lt;/em&gt;&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%2F4a6xq4hi6lnx2043lrl7.png" 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%2F4a6xq4hi6lnx2043lrl7.png" alt="Shopping workflow" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;An AI shopping agent needs current product data, a way to compare like-for-like offers and an honest account of missing costs. ShopScout supplies search, product lookup, offer comparison and shipping-plan tools through an HTTP API and an MCP wrapper. This guide shows how to connect them to a tool-capable agent without tying the design to one chat model.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build around the tool contract, not one chat brand
&lt;/h2&gt;

&lt;p&gt;The useful boundary is between the model that reasons about a request and the tools that fetch evidence. &lt;a href="https://modelcontextprotocol.io/docs/2026-07-28/learn/architecture" rel="noopener noreferrer"&gt;MCP’s architecture&lt;/a&gt; describes how a host connects through clients to servers that expose capabilities. It does not grant a model shopping data, payment permission or checkout access by itself.&lt;/p&gt;

&lt;p&gt;Use ShopScout’s local stdio MCP server in a host that supports it, such as an appropriately configured Claude Desktop setup. For a custom agent, call the HTTP API or adapt its contract to your framework’s tool format. Check the client’s actual transport support before copying a configuration.&lt;/p&gt;

&lt;p&gt;The design can serve Claude-based agents, OpenAI-based agents, other model providers and custom bots. That does not mean every consumer chat app accepts this MCP package. ShopScout’s hosted /mcp endpoint is currently a free discovery surface with list_tools, not a remote replacement for the executable paid stdio tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with the downloadable, no-payment kit
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://forgemesh.io/content/assets/shopscout-starter.zip" rel="noopener noreferrer"&gt;Download the ShopScout starter kit&lt;/a&gt;. It contains a minimal MCP configuration, a Node.js discovery check, valid search and shipping request examples, and an agent instruction file. The examples use illustrative inputs and make no claims about current product results.&lt;/p&gt;

&lt;p&gt;Unzip the kit and run &lt;strong&gt;node shopscout-discover.mjs&lt;/strong&gt; with Node.js 20 or later. It reads the free capabilities and OpenAPI endpoints. Add &lt;strong&gt;--check-payment-gate&lt;/strong&gt; to send one unsigned search request and verify that the API requests payment. The script has no wallet support and does not sign or submit a payment.&lt;/p&gt;

&lt;p&gt;This first check answers a concrete question: can your environment reach the service and discover its contract? A 402 response to the optional search check is the expected payment gate, not a completed search. It proves neither product coverage nor paid settlement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Connect the MCP wrapper to a compatible client
&lt;/h2&gt;

&lt;p&gt;The package is &lt;a href="https://github.com/forgemeshlabs/shopscout-mcp" rel="noopener noreferrer"&gt;@forgemeshlabs/shopscout-mcp&lt;/a&gt;. In the kit’s mcp-config.json, the command is npx and the arguments are -y followed by the package name. Merge that server entry into the configuration format your client uses; do not replace unrelated servers.&lt;/p&gt;

&lt;p&gt;The starter leaves out WALLET_PRIVATE_KEY. In that state, get_capabilities works and paid tools report payment_required rather than paying. When you deliberately enable payments, supply a dedicated, low-balance Base wallet through the client’s protected configuration. Do not put a real key in prompts, screenshots or a shared example file.&lt;/p&gt;

&lt;p&gt;The current wrapper caps each call with SHOPSCOUT_MAX_PRICE_USD, defaulting to 0.01. It checks the payment request before signing and retries once with authorization. See the &lt;a href="https://github.com/forgemeshlabs/shopscout-mcp" rel="noopener noreferrer"&gt;package README&lt;/a&gt; for current setup and payment behavior.&lt;/p&gt;

&lt;h2&gt;
  
  
  Give the agent a small, explicit shopping workflow
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Discover:&lt;/strong&gt; call get_capabilities first. Check whether a tool is available, disabled or planned. A planned watch operation is not something the agent can schedule by calling it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Search:&lt;/strong&gt; call search_products with a query, country and currency. A valid starter request is {"query":"compact coffee grinder","country":"US","currency":"USD","limit":3}. Limit the result count while you test. A valid search that returns no matches can still incur the tool fee.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Refresh:&lt;/strong&gt; use get_product with a real ID returned by the catalog and the intended options. Never invent variant IDs. Preserve the source timestamps so the final answer can explain how fresh its evidence is.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compare:&lt;/strong&gt; pass two to ten distinct returned variant IDs to compare_offers in the same currency. Check size, pack count, model and condition before treating them as equivalent. ShopScout’s comparison ranks item prices; it does not verify product equivalence or declare a final delivered-cost winner.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Estimate delivery costs:&lt;/strong&gt; call compare_shipping_plans only after you have shipping rules to supply. Keep their source with the request. Then return the shortlist with known prices, missing costs and merchant links. Buying the item belongs to a separate, explicitly authorized checkout flow.&lt;/p&gt;

&lt;h2&gt;
  
  
  A lower item price is only one part of the answer
&lt;/h2&gt;

&lt;p&gt;The kit includes shipping-example.json with two illustrative offers for one item. Offer A costs 4900 minor units plus 1200 for shipping. Offer B costs 5500 with shipping set to zero by the supplied example rule. In USD, those pre-tax totals are $61 and $55.&lt;/p&gt;

&lt;p&gt;The shipping request names items, offers, fulfillment groups and methods. It gives each group a rule_source and supported destination countries. Amounts are integer minor units, not floating-point dollars. The example also supplies a stated maximum delivery time for each method.&lt;/p&gt;

&lt;p&gt;These are invented inputs for learning the request format, not live merchant terms. ShopScout compares the plans described by those inputs. It does not fetch a carrier quote or prove the supplied delivery promise.&lt;/p&gt;

&lt;p&gt;Keep taxes, duties and landed_total null when unknown. Show the known subtotal beside the missing fields. A UI that converts null to zero can turn an incomplete estimate into a false claim about the cheapest order.&lt;/p&gt;

&lt;h2&gt;
  
  
  Set a task budget above the per-call cap
&lt;/h2&gt;

&lt;p&gt;The four paid operations currently cost $0.01 each; get_capabilities is free. One search, one product refresh, one offer comparison and one shipping comparison would cost $0.04 in tool fees at that price. That excludes model usage, hosting and any eventual purchase.&lt;/p&gt;

&lt;p&gt;A $0.01 per-call cap is not a $0.01 task budget. Ten accepted calls can spend ten cents. Put a separate maximum call count and total tool-fee budget in the host, where the model cannot casually override them.&lt;/p&gt;

&lt;p&gt;For a first paid workflow, a four-call limit makes the cost easy to inspect. Stop when the limit is reached, when essential inputs are missing or when the service rejects payment. Do not let the agent retry payment failures in a loop.&lt;/p&gt;

&lt;p&gt;Use the &lt;a href="https://shopscout.forgemesh.io/openapi.json" rel="noopener noreferrer"&gt;live OpenAPI contract&lt;/a&gt; as the source for route schemas and consult &lt;a href="https://shopscout.forgemesh.io/v1/capabilities" rel="noopener noreferrer"&gt;capabilities&lt;/a&gt; for current availability. A free discovery check is a good starting point, but test an authorized paid flow before describing your integration as production-ready.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep product text out of the instruction channel
&lt;/h2&gt;

&lt;p&gt;A catalog description may contain claims, links or even text that looks like a command. Treat those fields as untrusted data. They must not change wallet settings, raise budgets or tell the agent which tools to run.&lt;/p&gt;

&lt;p&gt;The kit’s agent instructions ask for exact product identity, source links, known costs and explicit unknowns. Enforce payment and tool permissions in application code too. A prompt is useful guidance; it is not a security boundary.&lt;/p&gt;

&lt;p&gt;Follow the package guidance not to cache catalog search results. Retain only operational records you need, such as call counts and settlement references, with sensitive information redacted. Refresh product evidence for a decision instead of presenting an old search as live stock.&lt;/p&gt;

&lt;h2&gt;
  
  
  Run locally first; hosting is optional
&lt;/h2&gt;

&lt;p&gt;The MCP wrapper can run locally while calling the hosted ShopScout API. You do not need a new server just to try it. A persistent custom agent may need hosting later, depending on your application.&lt;/p&gt;

&lt;p&gt;If you choose &lt;a href="https://forgemesh.io/go/digitalocean" rel="sponsored noopener noreferrer"&gt;DigitalOcean hosting through our affiliate link&lt;/a&gt;, ForgeMesh may earn a commission. You can use &lt;a href="https://www.digitalocean.com/pricing/droplets" rel="noopener noreferrer"&gt;DigitalOcean’s direct pricing page without our affiliate link&lt;/a&gt; or another host. Hosting is separate from ShopScout’s per-call fees and is not required by the starter kit.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this shopping agent can and cannot do
&lt;/h2&gt;

&lt;p&gt;It can research products in the configured catalog, refresh details, compare item prices and evaluate supplied shipping rules. It cannot guarantee coverage of every merchant or know a missing tax value. ShopScout does not place orders, provide a scheduler or execute the planned price and stock watches.&lt;/p&gt;

&lt;p&gt;Those boundaries make the first version easier to explain: “Here are three options, the evidence I used and what you still need to check.” Use our &lt;a href="https://forgemesh.io/blog/ai-shopping-assistants-holiday-shopping" rel="noopener noreferrer"&gt;consumer shopping prompt&lt;/a&gt; as the front end to that experience.&lt;/p&gt;

&lt;p&gt;Start with the &lt;a href="https://shopscout.forgemesh.io/v1/capabilities" rel="noopener noreferrer"&gt;free capabilities endpoint&lt;/a&gt;, then connect the &lt;a href="https://forgemesh.io/shopscout" rel="noopener noreferrer"&gt;ShopScout tools&lt;/a&gt; to your agent. For the wider context, read &lt;a href="https://forgemesh.io/blog/agentic-commerce-explained" rel="noopener noreferrer"&gt;agentic commerce explained&lt;/a&gt; and the &lt;a href="https://forgemesh.io/blog/shopscout-launch-open-shopping-api-for-agents" rel="noopener noreferrer"&gt;ShopScout launch&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>javascript</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>AI Shopping Assistants: A Better Way to Find Gifts</title>
      <dc:creator>bot bot</dc:creator>
      <pubDate>Fri, 02 Oct 2026 18:05:13 +0000</pubDate>
      <link>https://dev.to/kirothebot/ai-shopping-assistants-a-better-way-to-find-gifts-5286</link>
      <guid>https://dev.to/kirothebot/ai-shopping-assistants-a-better-way-to-find-gifts-5286</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://forgemesh.io/blog/ai-shopping-assistants-holiday-shopping?utm_source=devto&amp;amp;utm_medium=social&amp;amp;utm_campaign=ai-shopping-assistants-holiday-shopping" rel="noopener noreferrer"&gt;ForgeMesh&lt;/a&gt;.&lt;/em&gt;&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%2Frp1en4jj89ezv386pfhh.png" 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%2Frp1en4jj89ezv386pfhh.png" alt="Shopping workflow" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;AI shopping assistants can turn a vague gift idea into a useful shortlist. The trick is to give them a budget, a deadline and a few firm rules, then ask for evidence behind each choice. You can use this approach with Gemini, ChatGPT, Copilot, Perplexity, Alexa for Shopping, Claude or a tool-equipped personal agent. What each can search or buy depends on its current tools and your account.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why AI holiday shopping is worth trying in 2026
&lt;/h2&gt;

&lt;p&gt;Holiday shopping is a good test for AI. You have a person to buy for, a price limit and a date the gift must arrive. That gives an assistant something much more useful to work with than “show me popular gifts.”&lt;/p&gt;

&lt;p&gt;In its September 28 &lt;a href="https://business.adobe.com/resources/holiday-shopping-report.html" rel="noopener noreferrer"&gt;holiday shopping forecast&lt;/a&gt;, Adobe reported that AI-driven traffic to retail sites grew 127% year over year in August 2026. That measures visits from AI sources. It does not mean 127% more people let a bot buy things on its own.&lt;/p&gt;

&lt;p&gt;The practical opportunity is smaller and more useful: spend less time opening tabs, get a clearer comparison and spot missing facts before you pay. This guide focuses on that job across assistants. Our earlier &lt;a href="https://forgemesh.io/blog/can-chatgpt-buy-things-for-me" rel="noopener noreferrer"&gt;guide to buying through ChatGPT&lt;/a&gt; covers the question from one app’s point of view.&lt;/p&gt;

&lt;h2&gt;
  
  
  Choose by shopping task, then check the app
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Google Gemini and Google shopping tools:&lt;/strong&gt; Google has &lt;a href="https://blog.google/products-and-platforms/products/shopping/google-shopping-cart/" rel="noopener noreferrer"&gt;announced Universal Cart&lt;/a&gt; across several of its surfaces, including Gemini. Treat product announcements and features visible in your own account as separate things. Check whether your chosen retailer, country and item are supported before you expect checkout inside a chat.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ChatGPT:&lt;/strong&gt; &lt;a href="https://help.openai.com/en/articles/11128490-shopping-with-chatgpt-search" rel="noopener noreferrer"&gt;Shopping search&lt;/a&gt; can surface products and merchant links; eligible listings may offer an in-chat checkout path. A product card is still a starting point. Open the offer to check the exact model, stock and final price.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Microsoft Copilot:&lt;/strong&gt; Microsoft describes a &lt;a href="https://support.microsoft.com/en-us/microsoft-copilot/shopping-with-microsoft-copilot" rel="noopener noreferrer"&gt;shopping flow&lt;/a&gt; that helps compare options and sends you to the retailer when you choose Buy. Availability varies by market and platform. It can be useful even when the purchase itself happens elsewhere.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Alexa for Shopping:&lt;/strong&gt; Amazon &lt;a href="https://www.aboutamazon.com/news/retail/alexa-for-shopping-ai-assistant" rel="noopener noreferrer"&gt;combined Rufus and Alexa+&lt;/a&gt; into Alexa for Shopping. It brings product help and personal context into Amazon’s shopping experience. A store’s own assistant is worth using for questions about that store; check other sellers when breadth matters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Claude, Perplexity and personal agents:&lt;/strong&gt; Start by asking what sources and tools the current session can actually access. Claude’s &lt;a href="https://support.claude.com/en/articles/11725091-when-to-use-desktop-and-web-connectors" rel="noopener noreferrer"&gt;desktop and web connectors&lt;/a&gt; have different setup paths. A connector, browser or shopping tool can change what an agent can do; the model name alone does not tell you whether it can retrieve live prices or place orders.&lt;/p&gt;

&lt;h2&gt;
  
  
  Copy this prompt into your preferred assistant
&lt;/h2&gt;

&lt;p&gt;“Help me choose a gift for someone who likes cooking and has a small kitchen. My total budget is $75 including shipping and tax. Delivery is to the United States by December 15. Avoid subscriptions, large appliances and items that need a separate paid accessory.”&lt;/p&gt;

&lt;p&gt;“Ask up to three questions if needed. Then show three options with the exact model or size, seller, item price, shipping, tax, expected arrival, return terms and a source link. Mark missing facts unknown. Tell me when you checked each offer. Explain one reason to choose and one reason to skip each option.”&lt;/p&gt;

&lt;p&gt;“Use live sources if available and say if you cannot access them. Do not call an item the cheapest unless the compared offers are for the same thing. Do not buy anything. Give me a shortlist to review.”&lt;/p&gt;

&lt;p&gt;This is a reusable prompt, not a switch that enables missing features. If the assistant cannot browse, give it two or three retailer links or paste the key details yourself. You can still ask it to compare dimensions, terms and trade-offs.&lt;/p&gt;

&lt;h2&gt;
  
  
  The $49 gift can cost more than the $55 gift
&lt;/h2&gt;

&lt;p&gt;For example, compare these two invented offers. They are not live product recommendations. Seller A lists an item for $49 with $12 shipping. Seller B lists the same item for $55 with free shipping. Before tax, the totals are $61 and $55. The lower sticker price loses by $6.&lt;/p&gt;

&lt;p&gt;Now add a deadline. If Seller B only gives an uncertain arrival window, Seller A might still be the better choice for a time-sensitive gift. Ask the assistant to separate the lowest known cost from the option most likely to meet your deadline.&lt;/p&gt;

&lt;p&gt;Unknown tax is not zero tax. An unknown delivery date is not a promise. When key details are missing, the useful answer is “check this before buying,” followed by a link to the seller.&lt;/p&gt;

&lt;h2&gt;
  
  
  Compare the exact product, not just its name
&lt;/h2&gt;

&lt;p&gt;Before you pick a winner, check model number, size, color, pack count, condition and included parts. A two-pack, a single item and a refurbished unit can share most of a title. A cheap appliance may need an accessory that the other offer already includes.&lt;/p&gt;

&lt;p&gt;Ask for the evidence that matters to you. For a small kitchen, dimensions may beat a long feature list. For headphones, comfort and compatibility may matter more than an extra codec. For gifts, the return window may matter more than saving a few dollars.&lt;/p&gt;

&lt;p&gt;Finish with a simple question: “What would make you change this recommendation?” That often reveals the missing fact that deserves your next click.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where ShopScout fits into the shopping conversation
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://forgemesh.io/shopscout" rel="noopener noreferrer"&gt;ShopScout by ForgeMesh&lt;/a&gt; is our shopping tool for agents. An agent with the right integration can search the configured Shopify Global Catalog, refresh product details and compare offers. It can also compare shipping plans using rules supplied to it.&lt;/p&gt;

&lt;p&gt;That makes ShopScout useful when you want the assistant to work with structured product data instead of a loose list of suggestions. It is a developer-facing API and MCP tool today; opening a random chat app does not automatically connect it. If you build agents, use our &lt;a href="https://forgemesh.io/blog/build-ai-shopping-agent-mcp-shopscout" rel="noopener noreferrer"&gt;ShopScout integration guide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Each of its four paid operations currently costs $0.01 in USDC on Base. Capability discovery is free. The service fee pays for the tool call; it does not buy the product. ShopScout does not place orders, run price watches or guarantee a complete search of every store.&lt;/p&gt;

&lt;p&gt;Shipping comparisons are estimates from supplied rules, not live carrier quotes. Unknown taxes and duties remain unknown. Those limits are useful: they tell the assistant what it still needs to verify.&lt;/p&gt;

&lt;h2&gt;
  
  
  Want a starting point for tech gift ideas?
&lt;/h2&gt;

&lt;p&gt;You can browse our &lt;a href="https://forgemesh.io/go/amazon" rel="sponsored noopener noreferrer"&gt;Amazon storefront (affiliate link)&lt;/a&gt; for ideas, then use the prompt above to compare the item with other sellers. &lt;strong&gt;As an Amazon Associate, we earn from qualifying purchases.&lt;/strong&gt; You can also browse &lt;a href="https://www.amazon.com/" rel="noopener noreferrer"&gt;Amazon directly without our affiliate link&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Treat the storefront as a starting list, not a claim that those products are the best or cheapest for everyone. Keep your budget and needs in the prompt. Ask the assistant to justify any recommendation with facts you can check.&lt;/p&gt;

&lt;h2&gt;
  
  
  Can an AI assistant buy things for me?
&lt;/h2&gt;

&lt;p&gt;Some assistants and retailer integrations offer purchasing for eligible items. Others help you research and then send you to a store. Before authorizing an order, check the seller, exact item, quantity, delivered price and address in the checkout flow you are using.&lt;/p&gt;

&lt;p&gt;You do not need automatic checkout to get value from AI shopping. A good shortlist can save time on its own. If you do enable purchasing, make the spending limit and approval rule explicit in the tool’s actual settings.&lt;/p&gt;

&lt;h2&gt;
  
  
  Do I need crypto or a paid chatbot to try this?
&lt;/h2&gt;

&lt;p&gt;You do not need crypto to use the shopping prompt. Use a client and research tools you already have access to; its plan and usage limits still apply. ShopScout’s paid integration uses USDC, which is a separate choice for people building or configuring agents.&lt;/p&gt;

&lt;p&gt;For your next purchase, pick one real task: three gift ideas, the same item at two stores, or a basket that must arrive by a set date. Ask for sources and unknowns. Then check the final offer. If you want to understand the wider shift, start with our &lt;a href="https://forgemesh.io/blog/agentic-commerce-explained" rel="noopener noreferrer"&gt;guide to agentic commerce&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>shopping</category>
      <category>productivity</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Compress Before You Prompt: How a 74K-Star Token-First Architecture Is Making AI Coding Agents Smarter, Cheaper, and Actually Honest</title>
      <dc:creator>Tamiz Uddin</dc:creator>
      <pubDate>Fri, 02 Oct 2026 18:02:25 +0000</pubDate>
      <link>https://dev.to/tamizuddin/compress-before-you-prompt-how-a-74k-star-token-first-architecture-is-making-ai-coding-agents-d87</link>
      <guid>https://dev.to/tamizuddin/compress-before-you-prompt-how-a-74k-star-token-first-architecture-is-making-ai-coding-agents-d87</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://tamiz.pro/insights/token-first-architecture-ai-coding-agents-compression" rel="noopener noreferrer"&gt;tamiz.pro&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The context window is the new bottleneck. Every AI coding agent you've used — whether it's a local CLI assistant, a cloud IDE copilot, or an autonomous refactor bot — is fundamentally constrained by the same problem: models have finite context, but codebases are infinite in complexity. The result is a brutal engineering tradeoff. Stuff more context in, and you pay exponentially more per token while quality degrades from attention dilution. Stuff less in, and your agent hallucinates APIs, invents dependencies, and confidently writes code that doesn't compile against your actual codebase.&lt;/p&gt;

&lt;p&gt;A project that has accumulated over 74,000 GitHub stars in under a year offers a radically different approach. Instead of treating the context window as a fill-to-capacity resource, it treats token budget as a &lt;em&gt;scarce asset to be managed&lt;/em&gt; — compressing code, documents, and conversation history before they ever reach the model. This "token-first" architecture inverts the traditional prompt engineering paradigm: rather than asking "what should I put in the prompt?", it asks "what is the minimum information the model needs, expressed in the most information-dense form possible?"&lt;/p&gt;

&lt;p&gt;The results are striking. Benchmarks show 60-80% token cost reduction on real-world code understanding tasks, with &lt;em&gt;higher&lt;/em&gt; accuracy than uncompressed baselines. More importantly, hallucination rates drop dramatically — the agent stops inventing function signatures, fake imports, and nonexistent methods because it's working with surgically compressed, high-fidelity representations of actual code.&lt;/p&gt;

&lt;p&gt;This article dissects the architecture, explains the compression pipeline in detail, and walks through the engineering decisions that make this approach viable at scale.&lt;/p&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;1. The Context Window Crisis&lt;/li&gt;
&lt;li&gt;2. Architecture Overview&lt;/li&gt;
&lt;li&gt;3. The Compression Pipeline&lt;/li&gt;
&lt;li&gt;4. AST-Based Code Compression&lt;/li&gt;
&lt;li&gt;5. Semantic Chunking and Relevance Scoring&lt;/li&gt;
&lt;li&gt;6. The Honesty Problem and How Compression Solves It&lt;/li&gt;
&lt;li&gt;7. Token Budget Management&lt;/li&gt;
&lt;li&gt;8. Implementation Deep Dive&lt;/li&gt;
&lt;li&gt;9. Performance Benchmarks&lt;/li&gt;
&lt;li&gt;10. When This Architecture Breaks&lt;/li&gt;
&lt;li&gt;11. Building Your Own Token-First Agent&lt;/li&gt;
&lt;li&gt;12. Frequently Asked Questions&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  1. The Context Window Crisis
&lt;/h2&gt;

&lt;p&gt;Modern LLMs advertise context windows of 128K to 200K tokens. This sounds generous until you realize what actually goes into a coding agent's context:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Context Component&lt;/th&gt;
&lt;th&gt;Typical Token Cost&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;System prompt + tool definitions&lt;/td&gt;
&lt;td&gt;2,000–5,000&lt;/td&gt;
&lt;td&gt;Fixed overhead&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Conversation history&lt;/td&gt;
&lt;td&gt;5,000–20,000&lt;/td&gt;
&lt;td&gt;Grows linearly with turns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Repository structure (file tree)&lt;/td&gt;
&lt;td&gt;3,000–10,000&lt;/td&gt;
&lt;td&gt;For medium projects&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Referenced source files&lt;/td&gt;
&lt;td&gt;10,000–50,000&lt;/td&gt;
&lt;td&gt;The biggest variable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Documentation / README&lt;/td&gt;
&lt;td&gt;2,000–8,000&lt;/td&gt;
&lt;td&gt;Often low signal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Linting/test output&lt;/td&gt;
&lt;td&gt;1,000–5,000&lt;/td&gt;
&lt;td&gt;Noisy&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A single "refactor this module" request can consume 80,000+ tokens of context, leaving almost no room for the model's actual reasoning. Worse, attention mechanisms don't handle uniform token importance well — a 50,000-token context with only 3,000 relevant tokens produces measurably worse outputs than a focused 5,000-token context.&lt;/p&gt;

&lt;p&gt;The traditional approach has been &lt;em&gt;retrieval augmentation&lt;/em&gt;: use a vector database to find "relevant" chunks and stuff them in. This helps, but it's blunt. Vector similarity doesn't understand code semantics — a function named &lt;code&gt;calculate&lt;/code&gt; might match a completely unrelated &lt;code&gt;calculate&lt;/code&gt; in another module. And once chunks are in the context window, they're immutable. The model sees them all with equal weight.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Architecture Overview
&lt;/h2&gt;

&lt;p&gt;The token-first architecture introduces a &lt;strong&gt;compression layer&lt;/strong&gt; between the raw codebase and the model. Instead of feeding source files directly into the prompt, every piece of code passes through a multi-stage pipeline that reduces token count while preserving semantic fidelity.&lt;/p&gt;

&lt;p&gt;Here's the high-level data flow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────────┐
│                    AI Coding Agent Runtime                        │
├─────────────────────────────────────────────────────────────────┤
│                                                                   │
│  ┌──────────┐    ┌──────────────┐    ┌───────────────────────┐  │
│  │  Raw     │───▶│  Compression │───▶│  Token Budget         │  │
│  │  Codebase│    │  Pipeline    │    │  Allocator             │  │
│  └──────────┘    └──────────────┘    └───────────┬───────────┘  │
│       │                    │                      │              │
│       │                    ▼                      ▼              │
│       │            ┌──────────────┐    ┌───────────────────────┐ │
│       │            │  AST Parser  │    │  Context Assembly     │ │
│       │            │  + Indexer   │    │  + Prompt Builder     │ │
│       │            └──────────────┘    └───────────┬───────────┘ │
│       │                                             │             │
│       │                                             ▼             │
│       │                                    ┌───────────────┐     │
│       │                                    │  LLM Backend  │     │
│       │                                    │  (Any Model)  │     │
│       │                                    └───────────────┘     │
│       ▼                                                         │
│  ┌──────────┐                                                   │
│  │  Git /   │                                                   │
│  │  FS      │                                                   │
│  └──────────┘                                                   │
└─────────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The key architectural insight is that compression happens &lt;em&gt;before&lt;/em&gt; any model call. The pipeline is deterministic, fast (typically under 50ms for a 2,000-line file), and produces representations that are dramatically more information-dense than raw source code.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. The Compression Pipeline
&lt;/h2&gt;

&lt;p&gt;The compression pipeline consists of four stages, each targeting a different class of redundancy:&lt;/p&gt;

&lt;h3&gt;
  
  
  Stage 1: Structural Compression (AST Simplification)
&lt;/h3&gt;

&lt;p&gt;Raw source code contains massive redundancy from a semantic perspective. Consider this TypeScript function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Original: 187 tokens&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;processUserData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ProcessOptions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;includeHistory&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;maxRecords&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5000&lt;/span&gt;
  &lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="nx"&gt;ProcessOptions&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;UserDataResponse&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;User ID is required&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;userService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`User not found: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;records&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;recordService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getRecent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;maxRecords&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;records&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;records&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;
    &lt;span class="p"&gt;})),&lt;/span&gt;
    &lt;span class="na"&gt;processedAt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toISOString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The AST-based compressor transforms this into a &lt;strong&gt;semantic skeleton&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;// Compressed: 42 tokens
fn processUserData(userId: string, options?: ProcessOptions) -&amp;gt; UserDataResponse
  deps: userService.findById, recordService.getRecent
  throws: Error(userId required), Error(user not found)
  returns: {id, name, email, records[{id,timestamp,value}], processedAt}
  defaults: includeHistory=false, maxRecords=100, timeout=5000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This preserves every piece of information the model actually needs — the function signature, its dependencies, error conditions, return shape, and default values — while eliminating formatting, boilerplate, and implementation details that are irrelevant for &lt;em&gt;understanding&lt;/em&gt; the code's interface.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stage 2: Dependency Graph Compression
&lt;/h3&gt;

&lt;p&gt;Rather than including full source files for every imported module, the architecture maintains a &lt;strong&gt;compressed dependency graph&lt;/strong&gt;. Each module is represented as a node with its exported interfaces, and edges represent import relationships.&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;"module"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"src/services/userService.ts"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"exports"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"findById"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"signature"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"(id: string) =&amp;gt; Promise&amp;lt;User | null&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"sideEffects"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"db.query"&lt;/span&gt;&lt;span class="p"&gt;]&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;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"createUser"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"signature"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"(data: CreateUserInput) =&amp;gt; Promise&amp;lt;User&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"sideEffects"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"db.insert"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eventBus.emit"&lt;/span&gt;&lt;span class="p"&gt;]&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;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"imports"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"src/models/User.ts"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"src/db/connection.ts"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tokenCountOriginal"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;890&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tokenCountCompressed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;95&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;When the model needs to understand how &lt;code&gt;processUserData&lt;/code&gt; works, it sees the compressed signatures of &lt;code&gt;userService&lt;/code&gt; and &lt;code&gt;recordService&lt;/code&gt; — not their full implementations. If it needs deeper detail, it can request expansion of specific functions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stage 3: Conversation History Compression
&lt;/h3&gt;

&lt;p&gt;Multi-turn coding conversations accumulate enormous context. The architecture applies &lt;strong&gt;progressive summarization&lt;/strong&gt; to earlier turns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Turn 1-3 (raw): ~3,200 tokens
User: Can you refactor the auth module to use JWT instead of sessions?
Agent: I'll start by examining the current auth implementation...
[agent reads 3 files, proposes changes, applies patches]

// After compression: ~340 tokens
[Turns 1-3 Summary] Refactored auth from session-based to JWT.
Modified: auth/middleware.ts (JWT validation), auth/routes.ts (token extraction),
auth/models.ts (added TokenPayload interface). Removed: sessionStore.ts.
Key decision: Using HS256 with 24h expiry, refresh tokens in httpOnly cookies.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The compression preserves decisions, file modifications, and architectural choices — the things a model needs to maintain consistency across turns — while discarding exploratory reasoning, intermediate states, and verbose explanations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stage 4: Output Token Budgeting
&lt;/h3&gt;

&lt;p&gt;This is the most architecturally significant innovation. Rather than letting the model generate freely, the system allocates a &lt;strong&gt;token budget&lt;/strong&gt; across different components of the response:&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;"totalBudget"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4096&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"allocation"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="nl"&gt;"reasoning"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;512&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2560&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"explanation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;768&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"metadata"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;256&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;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;The model is instructed to stay within these bounds, and the runtime enforces truncation or regeneration if any section exceeds its allocation. This prevents the common failure mode where a model spends 3,000 tokens explaining context before producing 500 tokens of actual code.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. AST-Based Code Compression
&lt;/h2&gt;

&lt;p&gt;The core of the compression engine is a language-aware AST parser that transforms source code into a compact semantic representation. Let's look at how this works in practice.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Compression Algorithm
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Simplified representation of the compression pipeline
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;dataclasses&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;dataclass&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Literal&lt;/span&gt;

&lt;span class="nd"&gt;@dataclass&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CompressedFunction&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="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;tuple&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="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;  &lt;span class="c1"&gt;# (name, type)
&lt;/span&gt;    &lt;span class="n"&gt;return_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;dependencies&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&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="c1"&gt;# external calls
&lt;/span&gt;    &lt;span class="n"&gt;side_effects&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&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="c1"&gt;# mutations, I/O
&lt;/span&gt;    &lt;span class="n"&gt;errors&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&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="c1"&gt;# thrown errors
&lt;/span&gt;    &lt;span class="n"&gt;complexity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Literal&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;trivial&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;moderate&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;complex&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;to_prompt_tokens&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&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;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Serialize to minimal token representation.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="n"&gt;params_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;, &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&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="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;parts&lt;/span&gt; &lt;span class="o"&gt;=&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;fn &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;(&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;params_str&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;) -&amp;gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;return_type&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;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dependencies&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&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;  calls: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dependencies&lt;/span&gt;&lt;span class="p"&gt;)&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;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;side_effects&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&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;  mutates: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;side_effects&lt;/span&gt;&lt;span class="p"&gt;)&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;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;errors&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&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;  throws: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;errors&lt;/span&gt;&lt;span class="p"&gt;)&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;span class="n"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&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;  complexity: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;complexity&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;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parts&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;compress_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;source&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;language&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;budget&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;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    Compress a source file to fit within token budget.

    Strategy: lossless for public interfaces, lossy for internals.
    Priority order: exported &amp;gt; used-by-current-task &amp;gt; private &amp;gt; unused
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;ast&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;parse_ast&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;language&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Phase 1: Extract all symbols with metadata
&lt;/span&gt;    &lt;span class="n"&gt;symbols&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;extract_symbols&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Phase 2: Score each symbol by relevance
&lt;/span&gt;    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;sym&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;symbols&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;sym&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;compute_relevance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sym&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;current_task_context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Phase 3: Greedy selection within budget
&lt;/span&gt;    &lt;span class="n"&gt;symbols&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;s&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="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;reverse&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;span class="n"&gt;selected&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="n"&gt;used_tokens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;sym&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;symbols&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;cost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;estimate_tokens&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sym&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_prompt_tokens&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;used_tokens&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;cost&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;budget&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;selected&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sym&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;used_tokens&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;cost&lt;/span&gt;

    &lt;span class="c1"&gt;# Phase 4: If under budget, expand top-scoring symbols
&lt;/span&gt;    &lt;span class="n"&gt;remaining&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;budget&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;used_tokens&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;sym&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;selected&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;remaining&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;break&lt;/span&gt;
        &lt;span class="n"&gt;expanded_cost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;estimate_tokens&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sym&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_full_source&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;expanded_cost&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;remaining&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;sym&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;expanded&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
            &lt;span class="n"&gt;remaining&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="n"&gt;expanded_cost&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;serialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;selected&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The key insight is &lt;strong&gt;adaptive compression&lt;/strong&gt;: different parts of the codebase get different compression ratios based on their relevance to the current task. A function the model is about to modify gets near-full fidelity. A dependency it merely calls gets a signature-only representation. Unrelated code in the same file might be omitted entirely.&lt;/p&gt;

&lt;h3&gt;
  
  
  Language-Specific Compression Profiles
&lt;/h3&gt;

&lt;p&gt;Different languages have different redundancy patterns. The compressor uses language-specific rules:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Language&lt;/th&gt;
&lt;th&gt;Primary Redundancy&lt;/th&gt;
&lt;th&gt;Compression Strategy&lt;/th&gt;
&lt;th&gt;Typical Ratio&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;TypeScript/JavaScript&lt;/td&gt;
&lt;td&gt;Type annotations, JSDoc, verbose object literals&lt;/td&gt;
&lt;td&gt;Strip types for internal, keep for exports&lt;/td&gt;
&lt;td&gt;4-6x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;Docstrings, type hints, decorator boilerplate&lt;/td&gt;
&lt;td&gt;Preserve signatures, compress bodies&lt;/td&gt;
&lt;td&gt;3-5x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;td&gt;Error checking patterns, context propagation&lt;/td&gt;
&lt;td&gt;Collapse error guards to &lt;code&gt;throws:&lt;/code&gt; lists&lt;/td&gt;
&lt;td&gt;5-8x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rust&lt;/td&gt;
&lt;td&gt;Trait bounds, lifetimes, boilerplate impl blocks&lt;/td&gt;
&lt;td&gt;Abstract trait impls to capability lists&lt;/td&gt;
&lt;td&gt;6-10x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Java&lt;/td&gt;
&lt;td&gt;Getters/setters, annotations, imports&lt;/td&gt;
&lt;td&gt;Collapse CRUD, strip annotations&lt;/td&gt;
&lt;td&gt;8-12x&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  5. Semantic Chunking and Relevance Scoring
&lt;/h2&gt;

&lt;p&gt;Traditional RAG systems use fixed-size chunks (typically 512-1024 tokens) with overlap. This is fundamentally wrong for code, where a 50-line function is an atomic unit and splitting it across chunks destroys meaning.&lt;/p&gt;

&lt;p&gt;The token-first architecture uses &lt;strong&gt;semantic chunking&lt;/strong&gt; based on AST boundaries:&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;semantic_chunk&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;AST&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;target_tokens&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;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Chunk&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    Split code into semantically coherent chunks.
    Never splits across function/class boundaries.
    Groups related symbols into single chunks.
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;nodes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;  &lt;span class="c1"&gt;# top-level declarations
&lt;/span&gt;    &lt;span class="n"&gt;chunks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="n"&gt;current_chunk&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Chunk&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;nodes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;node_tokens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;estimate_tokens&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Check if adding this node would exceed budget
&lt;/span&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;current_chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;token_count&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;node_tokens&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;target_tokens&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;current_chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nodes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;chunks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;current_chunk&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;current_chunk&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Chunk&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="c1"&gt;# Special handling for large classes
&lt;/span&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ClassNode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;node_tokens&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;target_tokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;chunks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;chunk_large_class&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;target_tokens&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="k"&gt;continue&lt;/span&gt;

        &lt;span class="n"&gt;current_chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&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;current_chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nodes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;chunks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;current_chunk&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Merge adjacent small chunks (avoid fragmentation)
&lt;/span&gt;    &lt;span class="n"&gt;chunks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;merge_small_chunks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chunks&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;min_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;target_tokens&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="mi"&gt;3&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;chunks&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Relevance Scoring
&lt;/h3&gt;

&lt;p&gt;Each chunk receives a relevance score based on multiple signals:&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;compute_relevance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Chunk&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;query&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;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;TaskContext&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;float&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    Multi-signal relevance scoring for context selection.
    Returns float in [0.0, 1.0].
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;signals&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

    &lt;span class="c1"&gt;# Signal 1: Direct symbol match (highest weight)
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sym&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;sym&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exported_symbols&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;signals&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;direct_match&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.9&lt;/span&gt;

    &lt;span class="c1"&gt;# Signal 2: Import graph proximity
&lt;/span&gt;    &lt;span class="n"&gt;distance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;shortest_import_path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;target_module&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;signals&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;import_proximity&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;distance&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Signal 3: Embedding similarity (semantic)
&lt;/span&gt;    &lt;span class="n"&gt;signals&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;semantic&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;cosine_similarity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nf"&gt;embed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;compressed_repr&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="nf"&gt;embed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Signal 4: Recent modification (temporal relevance)
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;last_modified_hours&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;signals&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;recency&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt;

    &lt;span class="c1"&gt;# Signal 5: Git blame overlap with modified files
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;file&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;modified_files&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;signals&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;modified&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.7&lt;/span&gt;

    &lt;span class="c1"&gt;# Weighted combination
&lt;/span&gt;    &lt;span class="n"&gt;weights&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;direct_match&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;import_proximity&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;semantic&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;recency&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;modified&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.15&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;signals&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="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;weights&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&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;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This multi-signal approach is dramatically more accurate than pure vector similarity for code. A function that's semantically dissimilar to the query but sits in the same module as the target file will still score high due to import proximity and modification signals.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. The Honesty Problem and How Compression Solves It
&lt;/h2&gt;

&lt;p&gt;Here's where the architecture gets philosophically interesting. The primary complaint about AI coding agents is dishonesty — they hallucinate APIs, invent imports, and confidently write code that references nonexistent functions. The token-first architecture addresses this through &lt;strong&gt;grounded compression&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Hallucination Cascade
&lt;/h3&gt;

&lt;p&gt;Traditional agents hallucinate because of context dilution. When a model sees 80,000 tokens of context, it cannot maintain precise recall of every function signature. Under pressure to produce output, it fills gaps with plausible-sounding hallucinations:&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="c1"&gt;# Model hallucination example (traditional agent)
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;myapp.utils&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;parse_config&lt;/span&gt;  &lt;span class="c1"&gt;# DOES NOT EXIST
&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;process_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;          &lt;span class="c1"&gt;# process_data doesn't accept config param
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  How Compression Prevents Hallucination
&lt;/h3&gt;

&lt;p&gt;The compressed context is &lt;strong&gt;exhaustive for interfaces&lt;/strong&gt;. Every function, class, and exported symbol in the dependency graph appears in the compressed representation with its exact signature. There is no gap for the model to hallucinate into.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# What the model actually sees (compressed but complete):

Available functions in scope:
  fn parseConfig(path: string) -&amp;gt; AppConfig  [src/config/parser.ts]
  fn loadEnv(file?: string) -&amp;gt; Record&amp;lt;string,string&amp;gt;  [src/config/env.ts]
  fn process_data(input: InputData, opts?: ProcessOpts) -&amp;gt; Output  [src/core/engine.ts]

  NOTE: These are ALL exported functions in the dependency graph.
  If you need a function not listed here, it does not exist.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The architecture explicitly tells the model: &lt;em&gt;this is the complete set of available functions&lt;/em&gt;. There is no implicit knowledge, no retrieval gap. If the model needs something that isn't listed, it must ask or admit it doesn't exist.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Honesty Contract
&lt;/h3&gt;

&lt;p&gt;The system prompt includes an explicit honesty contract:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HONESTY CONTRACT:
1. You are given the COMPLETE list of available functions, types, and modules.
2. If you need something not in this list, state: "Not available in current context"
3. Never invent function names, parameters, or import paths.
4. If uncertain whether something exists, request clarification.
5. Your compressed context is authoritative — it reflects the actual codebase state.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This combination of exhaustive compressed interfaces plus explicit honesty instructions dramatically reduces hallucination. In benchmarks, the rate of invented function calls drops from ~12% (traditional RAG) to ~2% (token-first compression).&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Token Budget Management
&lt;/h2&gt;

&lt;p&gt;The token budget allocator is the central control mechanism that balances cost, quality, and completeness. It operates as a real-time optimization problem:&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;class&lt;/span&gt; &lt;span class="nc"&gt;TokenBudgetAllocator&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;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;model_max_context&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="n"&gt;cost_per_token&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;budget_limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;max_context&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model_max_context&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cost_per_token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cost_per_token&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;budget_limit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;budget_limit&lt;/span&gt;

        &lt;span class="c1"&gt;# Fixed allocations
&lt;/span&gt;        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;system_prompt_tokens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2048&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;safety_margin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;512&lt;/span&gt;  &lt;span class="c1"&gt;# room for model reasoning
&lt;/span&gt;
        &lt;span class="c1"&gt;# Dynamic allocation (the interesting part)
&lt;/span&gt;        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;available&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model_max_context&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;system_prompt_tokens&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;safety_margin&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;allocate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;components&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ContextComponent&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;dict&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="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
        Distribute available tokens across context components
        using utility-maximizing allocation.
        &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="c1"&gt;# Score each component by utility density (info per token)
&lt;/span&gt;        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;comp&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;components&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;comp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;utility_density&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;comp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;expected_usefulness&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;comp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;token_cost&lt;/span&gt;
            &lt;span class="n"&gt;comp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;compressed_cost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;comp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;token_cost&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;comp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;compression_ratio&lt;/span&gt;

        &lt;span class="c1"&gt;# Greedy allocation by utility density
&lt;/span&gt;        &lt;span class="n"&gt;components&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;utility_density&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;reverse&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;span class="n"&gt;allocation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
        &lt;span class="n"&gt;remaining&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;available&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;comp&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;components&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="c1"&gt;# Allocate compressed version first
&lt;/span&gt;            &lt;span class="n"&gt;comp_allocation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;comp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;compressed_cost&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;remaining&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;allocation&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;comp&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="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;comp_allocation&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;remaining&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="n"&gt;comp_allocation&lt;/span&gt;

            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;remaining&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;break&lt;/span&gt;

        &lt;span class="c1"&gt;# Validate against cost budget
&lt;/span&gt;        &lt;span class="n"&gt;total_cost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;allocation&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;c&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="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cost_per_token&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;components&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;total_cost&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;budget_limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="c1"&gt;# Scale down proportionally, preserving highest-utility components
&lt;/span&gt;            &lt;span class="n"&gt;scale&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;budget_limit&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;total_cost&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;comp&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;components&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;allocation&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;comp&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="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;allocation&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;comp&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="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;scale&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;allocation&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Budget Distribution Strategy
&lt;/h3&gt;

&lt;p&gt;The allocator uses a tiered priority system:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tier&lt;/th&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Allocation Priority&lt;/th&gt;
&lt;th&gt;Compression Level&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;Current task description&lt;/td&gt;
&lt;td&gt;Always full&lt;/td&gt;
&lt;td&gt;None (raw)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Modified files (this session)&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Light (2-3x)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Direct dependencies&lt;/td&gt;
&lt;td&gt;Medium-High&lt;/td&gt;
&lt;td&gt;Moderate (4-6x)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Indirect dependencies&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Heavy (6-10x)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Conversation summary&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;Progressive (varies)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Project config / conventions&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Maximum (10-15x)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Documentation / README&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Maximum or omit&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  8. Implementation Deep Dive
&lt;/h2&gt;

&lt;p&gt;Let's walk through a concrete implementation of the compression pipeline for a TypeScript project.&lt;/p&gt;

&lt;h3&gt;
  
  
  Setting Up the AST Parser
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// src/compression/ast-parser.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;FunctionDeclaration&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ClassDeclaration&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ExportStatement&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;typescript&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;CompressedSymbol&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;function&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;class&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;interface&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;const&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;enum&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;signature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;dependencies&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[];&lt;/span&gt;
  &lt;span class="nl"&gt;isExported&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;tokenCostOriginal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;tokenCostCompressed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;extractSymbols&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;fileName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;CompressedSymbol&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;source&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;fileName&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;symbols&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;CompressedSymbol&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;

  &lt;span class="nx"&gt;sf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEachChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;node&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;isExportStatement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;node&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEachChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;inner&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;handleExported&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;inner&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;symbols&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;isFunctionDeclaration&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;node&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nf"&gt;isClassDeclaration&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;node&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;handleExported&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;symbols&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;isVariableStatement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;node&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// Check if it's an exported const&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;hasModifier&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;export&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;handleExported&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;symbols&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&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="nx"&gt;symbols&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;handleExported&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;node&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;symbols&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;CompressedSymbol&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;isFunctionDeclaration&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;node&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;node&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;FunctionDeclaration&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; 
      &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getText&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;getText&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;any&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;returnType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;getText&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;void&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// Extract called functions&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;deps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;extractCalledFunctions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nx"&gt;symbols&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getText&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
      &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;function&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;signature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getText&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="s2"&gt;(&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;, &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;) -&amp;gt; &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;returnType&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;dependencies&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;deps&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;isExported&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;tokenCostOriginal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;countTokens&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getText&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt;
      &lt;span class="na"&gt;tokenCostCompressed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;countTokens&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;formatCompressedSymbol&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;symbols&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;symbols&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="c1"&gt;// ... handle classes, interfaces, etc.&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;extractCalledFunctions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Node&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;called&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;Set&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;visit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;node&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Node&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;isCallExpression&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;node&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;expr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;expression&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;isIdentifier&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;expr&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;called&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;expr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;isPropertyAccessExpression&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;expr&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;called&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;expr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getText&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nx"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEachChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;visit&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;visit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="nx"&gt;called&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The Compression Engine
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// src/compression/engine.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;extractSymbols&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;CompressedSymbol&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./ast-parser&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;estimateTokenCount&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./tokenizer&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;CompressionResult&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;compressed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;originalTokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;compressedTokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;ratio&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;symbolsIncluded&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;symbolsOmitted&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CompressionEngine&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;compressionProfile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;CompressionProfile&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;profile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;CompressionProfile&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;compressionProfile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;profile&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;compress&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;budget&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nl"&gt;focusSymbols&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[];&lt;/span&gt;
      &lt;span class="nl"&gt;includeDependencies&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;CompressionResult&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;symbols&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;extractSymbols&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;source&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fileName&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;unknown&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;originalTokens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;estimateTokenCount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;source&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Score symbols by relevance&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;scored&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;symbols&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sym&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;symbol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;sym&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;score&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;scoreSymbol&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sym&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;focusSymbols&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt;
    &lt;span class="p"&gt;}));&lt;/span&gt;

    &lt;span class="c1"&gt;// Sort by score, then greedily allocate budget&lt;/span&gt;
    &lt;span class="nx"&gt;scored&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;score&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;score&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;included&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;CompressedSymbol&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;usedTokens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;symbol&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;scored&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;compressed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;formatSymbol&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;symbol&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;estimateTokenCount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;compressed&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;usedTokens&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;cost&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;budget&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;included&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;symbol&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nx"&gt;usedTokens&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;cost&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Build output&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;compressed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;included&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;formatSymbol&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;compressedTokens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;estimateTokenCount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;compressed&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;compressed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;originalTokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;compressedTokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;ratio&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;originalTokens&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;compressedTokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;symbolsIncluded&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;included&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;symbolsOmitted&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;symbols&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;included&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nf"&gt;scoreSymbol&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sym&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;CompressedSymbol&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;focus&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]):&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sym&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isExported&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;score&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;focus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sym&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="nx"&gt;score&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sym&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;kind&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;function&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;score&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sym&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;kind&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;interface&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;score&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mf"&gt;0.4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// Penalize huge symbols (likely complex internals)&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;complexityPenalty&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;sym&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tokenCostOriginal&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;score&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="nx"&gt;complexityPenalty&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;score&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nf"&gt;formatSymbol&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sym&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;CompressedSymbol&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;prefix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;sym&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isExported&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;export &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;prefix&lt;/span&gt;&lt;span class="p"&gt;}${&lt;/span&gt;&lt;span class="nx"&gt;sym&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;sym&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signature&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sym&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dependencies&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s2"&gt;`\n  // calls: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;sym&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dependencies&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;, &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;`&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="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Integration with the Agent Loop
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// src/agent/context-builder.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;CompressionEngine&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../compression/engine&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;TokenBudgetAllocator&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../budget/allocator&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ContextBuilder&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;compressor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;CompressionEngine&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;allocator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;TokenBudgetAllocator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;dependencyGraph&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;DependencyGraph&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;buildContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;task&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;modifiedFiles&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;
    &lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
  &lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;AssembledContext&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;modelConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getModelConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Step 1: Identify relevant modules via dependency graph&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;relevantModules&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dependencyGraph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getTransitiveDependencies&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nx"&gt;modifiedFiles&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;depth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Step 2: Allocate token budget across components&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;budget&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;allocator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;allocate&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="nx"&gt;task&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;modifiedFiles&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;relevantModules&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;totalBudget&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;modelConfig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;maxContext&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;2048&lt;/span&gt; &lt;span class="c1"&gt;// reserve for system prompt&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="c1"&gt;// Step 3: Compress each component within its allocation&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;compressed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nx"&gt;relevantModules&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mod&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;source&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mod&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;compressor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;compress&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;source&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;budget&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;budget&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;mod&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;focusSymbols&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;extractFocusSymbols&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;task&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;mod&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;
      &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Step 4: Assemble final context&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;systemPrompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;buildSystemPrompt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;compressed&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="na"&gt;totalTokensUsed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;compressed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;compressedTokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="na"&gt;compressionRatio&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;computeOverallRatio&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;compressed&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="na"&gt;honestyGuarantees&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generateHonestyContract&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;compressed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  9. Performance Benchmarks
&lt;/h2&gt;

&lt;p&gt;The token-first architecture has been benchmarked across multiple coding tasks. Here are representative results:&lt;/p&gt;

&lt;h3&gt;
  
  
  Cost Comparison
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Traditional Agent (tokens)&lt;/th&gt;
&lt;th&gt;Token-First (tokens)&lt;/th&gt;
&lt;th&gt;Savings&lt;/th&gt;
&lt;th&gt;Quality Delta&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Understand 50-file module&lt;/td&gt;
&lt;td&gt;78,400&lt;/td&gt;
&lt;td&gt;9,200&lt;/td&gt;
&lt;td&gt;88%&lt;/td&gt;
&lt;td&gt;+3.2% accuracy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Refactor auth system&lt;/td&gt;
&lt;td&gt;62,100&lt;/td&gt;
&lt;td&gt;14,800&lt;/td&gt;
&lt;td&gt;76%&lt;/td&gt;
&lt;td&gt;+5.1% accuracy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Add new API endpoint&lt;/td&gt;
&lt;td&gt;45,300&lt;/td&gt;
&lt;td&gt;11,400&lt;/td&gt;
&lt;td&gt;75%&lt;/td&gt;
&lt;td&gt;+2.8% accuracy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Debug failing test&lt;/td&gt;
&lt;td&gt;38,700&lt;/td&gt;
&lt;td&gt;8,900&lt;/td&gt;
&lt;td&gt;77%&lt;/td&gt;
&lt;td&gt;+7.4% accuracy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-module rename&lt;/td&gt;
&lt;td&gt;91,200&lt;/td&gt;
&lt;td&gt;18,600&lt;/td&gt;
&lt;td&gt;79%&lt;/td&gt;
&lt;td&gt;+4.6% accuracy&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Hallucination Rates
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Traditional RAG&lt;/th&gt;
&lt;th&gt;Token-First&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Invented function calls&lt;/td&gt;
&lt;td&gt;12.3%&lt;/td&gt;
&lt;td&gt;1.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wrong import paths&lt;/td&gt;
&lt;td&gt;8.7%&lt;/td&gt;
&lt;td&gt;0.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Incorrect parameter types&lt;/td&gt;
&lt;td&gt;15.1%&lt;/td&gt;
&lt;td&gt;3.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nonexistent method calls&lt;/td&gt;
&lt;td&gt;9.4%&lt;/td&gt;
&lt;td&gt;1.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Overall hallucination rate&lt;/td&gt;
&lt;td&gt;11.4%&lt;/td&gt;
&lt;td&gt;1.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Latency Impact
&lt;/h3&gt;

&lt;p&gt;The compression pipeline adds minimal latency:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AST parsing: 5-15ms per file&lt;/li&gt;
&lt;li&gt;Symbol extraction: 2-8ms per file&lt;/li&gt;
&lt;li&gt;Relevance scoring: 1-3ms per module&lt;/li&gt;
&lt;li&gt;Total pipeline overhead: 20-80ms for a typical task&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is negligible compared to the 2-30 second LLM inference time it enables by reducing input size.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. When This Architecture Breaks
&lt;/h2&gt;

&lt;p&gt;No architecture is universally superior. The token-first approach has specific failure modes:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Low-Level Debugging
&lt;/h3&gt;

&lt;p&gt;When debugging a subtle off-by-one error or a race condition, the model needs to see the &lt;em&gt;exact&lt;/em&gt; implementation, not a compressed summary. The architecture must detect these scenarios and expand compression selectively.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Novel Pattern Generation
&lt;/h3&gt;

&lt;p&gt;If the task requires creating a pattern that doesn't exist in the codebase (e.g., "implement a circuit breaker pattern"), compressed context provides no reference material. The system needs to either fetch external knowledge or operate in a "generation mode" with minimal context.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Performance-Critical Code Review
&lt;/h3&gt;

&lt;p&gt;For tasks like "optimize this for throughput," the model needs to reason about specific implementation details — loop structures, allocation patterns, cache behavior. Heavy compression loses these details.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Very Large Monorepos
&lt;/h3&gt;

&lt;p&gt;The dependency graph grows superlinearly in monorepos with 10,000+ modules. The graph traversal itself becomes expensive, and the compressed representation of "all dependencies" may exceed the context window even after compression.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mitigation Strategies
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Adaptive compression: detect when full fidelity is needed&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;detectCompressionLevel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;task&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;TaskContext&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;CompressionLevel&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;debug|race|off-by-one|deadlock|memory leak&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="sr"&gt;/i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;task&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;minimal&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Near-full source&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;refactor|rename|add endpoint|new feature&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="sr"&gt;/i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;task&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;aggressive&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Heavy compression OK&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;optimize|performance|throughput|latency&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="sr"&gt;/i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;task&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;moderate&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Keep implementation details&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;standard&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Default balanced compression&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  11. Building Your Own Token-First Agent
&lt;/h2&gt;

&lt;p&gt;If you want to implement a token-first architecture for your own coding agent, here's the recommended build order:&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 1: Basic AST Compression (Week 1-2)
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Implement AST parsing for your target language(s)&lt;/li&gt;
&lt;li&gt;Build symbol extraction (functions, classes, interfaces)&lt;/li&gt;
&lt;li&gt;Create signature-only compression (no budget management yet)&lt;/li&gt;
&lt;li&gt;Verify that compressed representations are lossless for interfaces&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Phase 2: Dependency Graph (Week 2-3)
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Build import/export graph from your codebase&lt;/li&gt;
&lt;li&gt;Implement transitive dependency resolution&lt;/li&gt;
&lt;li&gt;Add import proximity scoring&lt;/li&gt;
&lt;li&gt;Cache the graph (rebuild on file changes)&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Phase 3: Budget Allocation (Week 3-4)
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Implement token estimation (use tiktoken or equivalent)&lt;/li&gt;
&lt;li&gt;Build the budget allocator with priority tiers&lt;/li&gt;
&lt;li&gt;Add adaptive compression levels&lt;/li&gt;
&lt;li&gt;Implement the honesty contract in your system prompt&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Phase 4: Conversation Compression (Week 4-5)
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Build progressive summarization for conversation history&lt;/li&gt;
&lt;li&gt;Implement decision extraction from agent outputs&lt;/li&gt;
&lt;li&gt;Add context window eviction policies&lt;/li&gt;
&lt;li&gt;Test with multi-turn sessions (20+ turns)&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Phase 5: Optimization (Ongoing)
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Add embedding-based relevance scoring&lt;/li&gt;
&lt;li&gt;Implement per-language compression profiles&lt;/li&gt;
&lt;li&gt;Build evaluation harness for hallucination detection&lt;/li&gt;
&lt;li&gt;Add compression quality monitoring in production&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Minimal Working Example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// A minimal token-first agent in ~100 lines&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;parse&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;typescript&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;OpenAI&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;openai&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;tokenFirstAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;task&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;codebase&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Step 1: Compress all files to signatures&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;compressed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;source&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;codebase&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;source&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;fileName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;symbols&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;

    &lt;span class="nx"&gt;sf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEachChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;node&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getText&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="c1"&gt;// Keep only exported declarations' signatures&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;export &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Truncate to first 200 chars (signature area)&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;signature&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nx"&gt;symbols&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;signature&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="nx"&gt;compressed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;symbols&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// Step 2: Build compressed context&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="nx"&gt;compressed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(([&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;sigs&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;`// &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;\n&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;sigs&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Step 3: Call model with compressed context&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gpt-4&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;system&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`
You have access to the following codebase interfaces:

&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;

HONESTY RULES:
- These are the ONLY available functions/classes in scope
- If you need something not listed, say it's not available
- Never invent function names or import paths
- Request clarification if uncertain
        `&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;  &lt;span class="nf"&gt;rim&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;task&lt;/span&gt; &lt;span class="p"&gt;}&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="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  12. Frequently Asked Questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  How does this compare to simply using a larger context window model?
&lt;/h3&gt;

&lt;p&gt;Larger context windows are &lt;em&gt;necessary but not sufficient&lt;/em&gt;. Attention mechanisms have diminishing returns beyond ~30-40K tokens of actual context — the model can't maintain precise recall across that much information. Token-first compression achieves better accuracy &lt;em&gt;within&lt;/em&gt; a smaller window than uncompressed context in a larger window. The combination of compression + larger windows is ideal, but compression provides independent value even with fixed window sizes.&lt;/p&gt;

&lt;h3&gt;
  
  
  What about languages without a standard AST parser?
&lt;/h3&gt;

&lt;p&gt;The architecture works best with languages that have mature parsers (TypeScript, Python, Go, Rust, Java). For languages without standard parsers, you can use tree-sitter as a universal parser backend. The compression quality will be lower (you lose type information), but structural compression still provides 2-3x reduction.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does this work with open-source models like Llama or CodeLlama?
&lt;/h3&gt;

&lt;p&gt;Yes, and arguably more so. Open-source models typically have smaller context windows (8K-32K), making token budget management even more critical. The compressed representations also tend to be more compatible with smaller models because they reduce the cognitive load — the model doesn't need to parse and understand verbose source code, just work with clean interface descriptions.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I measure if compression is hurting quality?
&lt;/h3&gt;

&lt;p&gt;Build an evaluation harness that compares outputs from compressed vs. uncompressed contexts on a held-out set of tasks. Key metrics: (1) Does the output compile? (2) Does it pass existing tests? (3) Does it reference only real functions? (4) Is the implementation semantically correct? If compression causes quality degradation on specific task types, tune the compression level for those scenarios using the adaptive system described above.&lt;/p&gt;




&lt;p&gt;The token-first architecture represents a fundamental shift in how we think about AI coding agents. Instead of treating context as a passive container to fill, it treats it as an active resource to manage — compressing, prioritizing, and guaranteeing honesty at the architectural level. The 74K-star traction reflects something real: developers are frustrated with agents that hallucinate, waste tokens, and produce unreliable output. A compression-first approach addresses all three problems simultaneously, and the engineering is accessible enough that you can build a working version in under a week.&lt;/p&gt;

&lt;p&gt;For more technical deep-dives on AI architecture and developer tooling, explore &lt;a href="https://tamiz.pro/insights" rel="noopener noreferrer"&gt;Tamiz's Insights&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machine</category>
      <category>learning</category>
      <category>compress</category>
    </item>
    <item>
      <title>Google’s Project Suncatcher Reaches Orbit to Test Space-Based AI Compute</title>
      <dc:creator>Ali Farhat</dc:creator>
      <pubDate>Fri, 02 Oct 2026 18:00:30 +0000</pubDate>
      <link>https://dev.to/alifar/googles-project-suncatcher-reaches-orbit-to-test-space-based-ai-compute-16cl</link>
      <guid>https://dev.to/alifar/googles-project-suncatcher-reaches-orbit-to-test-space-based-ai-compute-16cl</guid>
      <description>&lt;p&gt;Google has moved Project Suncatcher from a research concept to an in-orbit hardware demonstration. The company’s first prototype satellite, built with satellite operator Planet, launched aboard SpaceX’s Transporter-18 rideshare mission, has established contact, and is operating as expected. The mission is an early but concrete test of whether machine-learning infrastructure could one day operate in space.&lt;/p&gt;

&lt;p&gt;According to &lt;a href="https://blog.google/innovation-and-ai/models-and-research/google-research/project-suncatcher-prototype/" rel="noopener noreferrer"&gt;Google’s official Project Suncatcher update&lt;/a&gt;, the satellite will collect data over the coming weeks on how Google TPU hardware performs under radiation, thermal extremes, and microgravity. That makes the mission more than a standard satellite deployment. It is a practical experiment in placing specialized AI compute hardware in an environment far less forgiving than a terrestrial data center.&lt;/p&gt;

&lt;p&gt;The project does not create a new cloud product or make space-based computing available to businesses today. Instead, it establishes a first in-orbit test for a long-term research effort. Google originally announced Project Suncatcher in November 2025 as a moonshot to explore solar-powered, laser-linked satellite constellations that could support distributed machine-learning workloads.&lt;/p&gt;

&lt;h2&gt;
  
  
  From research concept to in-orbit TPU test
&lt;/h2&gt;

&lt;p&gt;Project Suncatcher is investigating a difficult premise: satellites above Earth could have access to abundant solar energy, while laser links between satellites could eventually move data and workloads across a constellation. The potential appeal is clear, but the engineering questions are substantial. AI accelerators must remain reliable despite radiation exposure, extreme temperature variation, and the physical conditions of orbit.&lt;/p&gt;

&lt;p&gt;Google says the prototype will gather evidence on those questions and has published a peer-reviewed paper in &lt;em&gt;Joule&lt;/em&gt; covering the mission research. Planet confirmed that it built and operates the satellite platforms used for the project, while Google is using the mission to test its TPU technology in space.&lt;/p&gt;

&lt;h3&gt;
  
  
  What the first satellite has demonstrated
&lt;/h3&gt;

&lt;p&gt;The most important confirmed milestone is operational, not commercial. Google and Planet have put a Project Suncatcher prototype into orbit and established contact with it. That changes the project’s status from a proposed architecture to an active experiment with real hardware.&lt;/p&gt;

&lt;p&gt;The mission is designed to examine several connected issues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;TPU resilience in orbit&lt;/strong&gt;, including behavior under radiation, thermal extremes, and microgravity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Satellite platform operations&lt;/strong&gt;, supported by Planet’s role in building and operating the spacecraft platform.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data collection from an in-orbit system&lt;/strong&gt;, planned over the weeks following launch.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Future distributed-compute design&lt;/strong&gt;, including the longer-term use of laser inter-satellite links.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Google’s stated roadmap includes two additional prototype satellites by early 2027, alongside continued work on system-scale experiments. Those future launches matter because a single spacecraft can test component behavior, while a networked system is needed to explore how workloads and communications could function across multiple satellites.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Project stage&lt;/th&gt;
      &lt;th&gt;Status&lt;/th&gt;
      &lt;th&gt;What it addresses&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Original Project Suncatcher concept&lt;/td&gt;
      &lt;td&gt;Announced in November 2025&lt;/td&gt;
      &lt;td&gt;A solar-powered, laser-linked constellation for machine-learning compute&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;First prototype satellite&lt;/td&gt;
      &lt;td&gt;In orbit and operating as expected&lt;/td&gt;
      &lt;td&gt;How TPU hardware performs under space conditions&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;Further prototype milestones&lt;/td&gt;
      &lt;td&gt;Planned by early 2027&lt;/td&gt;
      &lt;td&gt;Additional testing and progress toward system-scale experiments&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Why space-based AI compute is still a research problem
&lt;/h3&gt;

&lt;p&gt;Space can offer a very different energy environment from Earth-based infrastructure, but power is only one part of AI computing. A useful compute system must also maintain hardware reliability, manage heat, communicate data effectively, and coordinate workloads. Project Suncatcher is at the stage of measuring those constraints rather than proving that satellite-based AI infrastructure is viable at scale.&lt;/p&gt;

&lt;p&gt;Laser inter-satellite links are central to Google’s longer-term concept because distributed machine-learning workloads require systems to exchange information. However, the current announcement does not establish the performance, cost, latency, or commercial availability of such a network. It confirms that Google has begun collecting in-orbit evidence needed to assess the underlying technical premise.&lt;/p&gt;

&lt;h2&gt;
  
  
  What businesses should watch next
&lt;/h2&gt;

&lt;p&gt;For companies that use &lt;a href="https://scalevise.com/services" rel="noopener noreferrer"&gt;AI services&lt;/a&gt;, Project Suncatcher is a signal about the direction of compute research rather than an immediate infrastructure decision. No organization should plan workloads around space-based TPUs based on this prototype. The near-term relevance is that major AI providers are investigating alternatives to conventional, Earth-bound data center expansion.&lt;/p&gt;

&lt;p&gt;If the research progresses, the eventual questions for users could include where AI workloads run, how compute capacity is supplied, and which applications benefit from processing closer to satellite-generated data. Those outcomes remain unproven. The more immediate practical lesson is to distinguish between an in-orbit technology validation and a deployable business service.&lt;/p&gt;

&lt;h3&gt;
  
  
  Milestones worth monitoring
&lt;/h3&gt;

&lt;p&gt;The next meaningful updates are likely to clarify whether the project can move from testing individual hardware behavior toward operating connected infrastructure. Businesses and technology teams should watch for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Results from the prototype’s planned in-orbit data collection.&lt;/li&gt;
&lt;li&gt;The launch and operation of the two further prototypes targeted by early 2027.&lt;/li&gt;
&lt;li&gt;Evidence of laser inter-satellite link testing for distributed workloads.&lt;/li&gt;
&lt;li&gt;Any Google announcements about how the research could relate to broader AI infrastructure.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For firms working with remote sensing, satellite data, or AI-intensive applications, the project is particularly relevant as a longer-term indicator. &lt;a href="https://scalevise.com/services/software-development" rel="noopener noreferrer"&gt;Processing data&lt;/a&gt; in or near the environment where it is collected could become an important design question if this class of infrastructure matures. For most businesses, however, the appropriate response today is to track verified progress rather than assume new cost, latency, or capacity advantages.&lt;/p&gt;

&lt;p&gt;As AI infrastructure options evolve, businesses need a clear view of which developments can improve operations now and which are still research milestones. Scalevise helps teams assess practical AI opportunities, prioritize high-value use cases, and &lt;a href="https://scalevise.com/resources/ai-workflow-automation/" rel="noopener noreferrer"&gt;build a roadmap&lt;/a&gt; that fits their existing processes. Our &lt;a href="https://scalevise.com/services/ai-consultancy" rel="noopener noreferrer"&gt;AI consultancy services&lt;/a&gt; turn emerging technology into grounded implementation decisions, so you can focus investment where it has a realistic business impact. Request an AI consultation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Frequently Asked Questions
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;What is Google Project Suncatcher?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Project Suncatcher is Google’s long-term research project exploring whether machine-learning compute infrastructure could operate in space using satellites, solar power, and eventually laser inter-satellite links.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What has Google launched for Project Suncatcher?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Google launched a prototype satellite built in partnership with Planet aboard SpaceX’s Transporter-18 rideshare mission. Google says the satellite established contact and is operating as expected.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is the satellite testing?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The mission will collect data on how Google TPU hardware performs under radiation, thermal extremes, and microgravity in orbit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Will businesses be able to use space-based Google AI compute now?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. The mission is an in-orbit research demonstration, not a commercial cloud service or publicly available compute offering.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What happens next for Project Suncatcher?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Google plans two additional prototype satellites by early 2027 and continues to explore laser inter-satellite links and system-scale experiments.&lt;/p&gt;




&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;Project Suncatcher’s first operational satellite gives Google a real-world testbed for space-based AI compute. The mission does not yet prove a commercially viable alternative to terrestrial data centers, but it begins gathering the hardware and operational evidence needed to evaluate that possibility. The next prototypes and their results will show whether the concept can advance from component testing toward connected machine-learning infrastructure.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>tools</category>
      <category>gemini</category>
    </item>
  </channel>
</rss>
