<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>TeaQL Blog</title>
        <link>https://teaql.io/blog</link>
        <description>TeaQL Blog</description>
        <lastBuildDate>Tue, 16 Jun 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[Expanding the Horizon: Quarkus and Micronaut Support in TeaQL]]></title>
            <link>https://teaql.io/blog/quarkus-micronaut-support</link>
            <guid>https://teaql.io/blog/quarkus-micronaut-support</guid>
            <pubDate>Tue, 16 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[TeaQL now natively supports Quarkus and Micronaut, bringing our powerful generated business APIs to the broader cloud-native Java ecosystem.]]></description>
            <content:encoded><![CDATA[<p>We're thrilled to announce that TeaQL's code generation engine has expanded beyond its initial Spring Boot roots! You can now generate fully functional, domain-driven APIs for <strong>Quarkus</strong> and <strong>Micronaut</strong>.</p>
<p>By introducing the new <code>java-web-quarkus</code> and <code>java-web-micronaut</code> generation targets, TeaQL ensures you can leverage the exact same deterministic models and generated data-access logic across the most popular cloud-native Java frameworks today.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="beyond-spring-boot">Beyond Spring Boot<a href="https://teaql.io/blog/quarkus-micronaut-support#beyond-spring-boot" class="hash-link" aria-label="Direct link to Beyond Spring Boot" title="Direct link to Beyond Spring Boot">​</a></h2>
<p>While Spring Boot remains a powerhouse in the enterprise ecosystem, the demand for lightweight, fast-starting, and memory-efficient frameworks like Quarkus and Micronaut has grown rapidly—especially in serverless and container-heavy environments.</p>
<p>Our goal with TeaQL is to be framework-agnostic at the domain level. By separating our core execution logic into <code>teaql-provider-jdbc</code>, we were able to seamlessly integrate our triple-intent runtime into the CDI-based dependency injection systems of Quarkus and Micronaut.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="architecture--dependencies">Architecture &amp; Dependencies<a href="https://teaql.io/blog/quarkus-micronaut-support#architecture--dependencies" class="hash-link" aria-label="Direct link to Architecture &amp; Dependencies" title="Direct link to Architecture &amp; Dependencies">​</a></h2>
<p>To make this multi-framework support possible, we designed a clean separation between the domain logic and the framework-specific infrastructure. Depending on the framework you choose, your generated project will rely on a specific set of TeaQL components:</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="spring-boot-architecture">Spring Boot Architecture<a href="https://teaql.io/blog/quarkus-micronaut-support#spring-boot-architecture" class="hash-link" aria-label="Direct link to Spring Boot Architecture" title="Direct link to Spring Boot Architecture">​</a></h3>
<p>When targeting <code>java-web-spring-boot</code>, the architecture natively embraces Spring's ecosystem:</p>
<ul>
<li><strong><code>teaql-provider-spring-jdbc</code></strong>: The core execution adapter that binds TeaQL's AST to Spring's <code>NamedParameterJdbcTemplate</code>.</li>
<li><strong><code>teaql-data-service-sql</code></strong>: The standard SQL generation and metadata service.</li>
<li><strong>Infrastructure</strong>: Standard Spring Boot starters for Web and JDBC, utilizing Spring's <code>@Configuration</code> and <code>@Bean</code> lifecycle.</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="quarkus-architecture">Quarkus Architecture<a href="https://teaql.io/blog/quarkus-micronaut-support#quarkus-architecture" class="hash-link" aria-label="Direct link to Quarkus Architecture" title="Direct link to Quarkus Architecture">​</a></h3>
<p>For <code>java-web-quarkus</code>, we bypassed Spring dependencies entirely to keep the runtime lightweight and native-friendly:</p>
<ul>
<li><strong><code>teaql-provider-jdbc</code></strong>: A pure JDBC provider that connects directly to any <code>javax.sql.DataSource</code>.</li>
<li><strong><code>teaql-data-service-sql</code></strong>: The shared SQL runtime engine.</li>
<li><strong>Infrastructure</strong>: The generated application utilizes <code>quarkus-resteasy-reactive-jackson</code> for web endpoints, <code>quarkus-agroal</code> for high-performance connection pooling, and standard <code>@ApplicationScoped</code> CDI beans for registering the TeaQL runtime.</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="micronaut-architecture">Micronaut Architecture<a href="https://teaql.io/blog/quarkus-micronaut-support#micronaut-architecture" class="hash-link" aria-label="Direct link to Micronaut Architecture" title="Direct link to Micronaut Architecture">​</a></h3>
<p>Similarly, for <code>java-web-micronaut</code>, we optimized for Micronaut's ahead-of-time (AOT) compilation:</p>
<ul>
<li><strong><code>teaql-provider-jdbc</code></strong>: The same pure JDBC provider used in Quarkus.</li>
<li><strong><code>teaql-data-service-sql</code></strong>: The shared SQL runtime engine.</li>
<li><strong>Infrastructure</strong>: The output project uses <code>micronaut-http-server-netty</code> and <code>@Singleton</code> bean configurations, wiring natively into Micronaut's HikariCP data sources.</li>
</ul>
<p>Both new targets share the same underlying Java 21 <code>java-lib-core</code> library. Your business logic, data models, entities, and generated expressions remain 100% identical and portable.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="try-it-out">Try It Out<a href="https://teaql.io/blog/quarkus-micronaut-support#try-it-out" class="hash-link" aria-label="Direct link to Try It Out" title="Direct link to Try It Out">​</a></h2>
<p>Generating a new Quarkus or Micronaut project is as simple as changing the scope parameter when invoking the generator:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># For Quarkus</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">mvn exec:java -Dexec.mainClass="com.skynet.codegenerator.LocalGenerator" \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  -Dexec.args="java-web-quarkus /path/to/output model.xml"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># For Micronaut</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">mvn exec:java -Dexec.mainClass="com.skynet.codegenerator.LocalGenerator" \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  -Dexec.args="java-web-micronaut /path/to/output model.xml"</span><br></span></code></pre></div></div>
<p>We believe that your domain logic should outlive any specific framework. With these additions, TeaQL continues to deliver on the promise of durable, portable, and bug-free business code.</p>]]></content:encoded>
            <category>teaql</category>
            <category>quarkus</category>
            <category>micronaut</category>
            <category>java</category>
            <category>release</category>
        </item>
        <item>
            <title><![CDATA[Announcing Spring Boot 4.1.0 and Java 21 Support in TeaQL]]></title>
            <link>https://teaql.io/blog/spring-boot-4-1-support</link>
            <guid>https://teaql.io/blog/spring-boot-4-1-support</guid>
            <pubDate>Tue, 16 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[TeaQL code generation now officially supports Spring Boot 4.1.0 with a Java 21 baseline, bringing the latest Spring ecosystem features to your generated business APIs.]]></description>
            <content:encoded><![CDATA[<p>We are excited to announce that TeaQL's code generation engine has been fully upgraded to support the newly released <strong>Spring Boot 4.1.0</strong>, officially raising our Java baseline to <strong>Java 21</strong>.</p>
<p>This update ensures that any project generated with the <code>java-web-spring-boot</code> target will out-of-the-box leverage the modern Spring ecosystem, providing an even more robust and observable runtime for your business APIs.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="embracing-java-21">Embracing Java 21<a href="https://teaql.io/blog/spring-boot-4-1-support#embracing-java-21" class="hash-link" aria-label="Direct link to Embracing Java 21" title="Direct link to Embracing Java 21">​</a></h2>
<p>With this release, TeaQL leaves Java 17 behind and fully embraces <strong>Java 21</strong> as the baseline for both <code>java-lib-core</code> and the generated Spring Boot projects. This alignment allows your generated code and custom extensions to seamlessly utilize modern Java features like Virtual Threads (Project Loom), Pattern Matching, and Record patterns.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="whats-new-with-spring-boot-41-integration">What's New with Spring Boot 4.1 Integration<a href="https://teaql.io/blog/spring-boot-4-1-support#whats-new-with-spring-boot-41-integration" class="hash-link" aria-label="Direct link to What's New with Spring Boot 4.1 Integration" title="Direct link to What's New with Spring Boot 4.1 Integration">​</a></h2>
<p>Spring Boot 4.1.0 brings a host of powerful new features, and the TeaQL runtime has been validated to work perfectly alongside them:</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="native-grpc-support">Native gRPC Support<a href="https://teaql.io/blog/spring-boot-4-1-support#native-grpc-support" class="hash-link" aria-label="Direct link to Native gRPC Support" title="Direct link to Native gRPC Support">​</a></h3>
<p>Spring Boot 4.1 introduces native gRPC auto-configuration for both client and server applications. If you are extending your TeaQL-generated application with gRPC services, you can now use <code>@GrpcAdvice</code> for centralized exception handling and unified observation conventions without relying on third-party starter dependencies.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="enhanced-security-with-ssrf-mitigation">Enhanced Security with SSRF Mitigation<a href="https://teaql.io/blog/spring-boot-4-1-support#enhanced-security-with-ssrf-mitigation" class="hash-link" aria-label="Direct link to Enhanced Security with SSRF Mitigation" title="Direct link to Enhanced Security with SSRF Mitigation">​</a></h3>
<p>The new HTTP client Server-Side Request Forgery (SSRF) mitigation via <code>InetAddressFilter</code> is now available to your TeaQL applications. This provides an additional layer of security by allowing strict whitelisting and blacklisting of address ranges for outbound requests.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="advanced-observability">Advanced Observability<a href="https://teaql.io/blog/spring-boot-4-1-support#advanced-observability" class="hash-link" aria-label="Direct link to Advanced Observability" title="Direct link to Advanced Observability">​</a></h3>
<p>The updated OpenTelemetry support in Spring Boot 4.1 seamlessly integrates with TeaQL's generated API boundaries. Your generated queries, aggregations, and graph mutation operations can now be monitored with even greater precision.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="try-it-out">Try It Out<a href="https://teaql.io/blog/spring-boot-4-1-support#try-it-out" class="hash-link" aria-label="Direct link to Try It Out" title="Direct link to Try It Out">​</a></h2>
<p>You don't need to learn a new DSL or update your domain models to take advantage of this upgrade. Simply regenerate your project using the <code>java-web-spring-boot</code> target, and your new project structure and <code>pom.xml</code> will be automatically provisioned with Spring Boot 4.1.0 and Java 21.</p>
<p>Here is what your generated POM properties will look like:</p>
<div class="language-xml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-xml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">properties</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">java.version</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">21</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">java.version</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">spring-boot.version</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">4.1.0</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">spring-boot.version</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">&lt;!-- ... --&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">properties</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></span></code></pre></div></div>
<p>We remain committed to keeping TeaQL's output aligned with the industry's best practices and latest stable frameworks. Happy generating!</p>]]></content:encoded>
            <category>teaql</category>
            <category>spring-boot</category>
            <category>java</category>
            <category>release</category>
        </item>
        <item>
            <title><![CDATA[Validating Portability: The Vending Machine Multi-Framework Test]]></title>
            <link>https://teaql.io/blog/vending-machine-multi-framework-test</link>
            <guid>https://teaql.io/blog/vending-machine-multi-framework-test</guid>
            <pubDate>Tue, 16 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[How we tested the same TeaQL data model across Spring Boot, Quarkus, and Micronaut without writing a single line of framework-specific database logic.]]></description>
            <content:encoded><![CDATA[<p>One of the core philosophies of TeaQL is that <strong>business logic and data schemas should be completely decoupled from the web framework</strong>. To put this to the test, we recently conducted an end-to-end validation using our standard <code>vending-machine-service</code> example across the three major Java frameworks.</p>
<p>The results successfully demonstrated the power of declarative data models.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-setup">The Setup<a href="https://teaql.io/blog/vending-machine-multi-framework-test#the-setup" class="hash-link" aria-label="Direct link to The Setup" title="Direct link to The Setup">​</a></h2>
<p>We used a single <code>vending.xml</code> model definition, which describes a complete vending machine domain (machines, products, inventory, transactions, and orders).</p>
<p>We then generated three separate web applications pointing to the exact same PostgreSQL database:</p>
<ol>
<li><code>005-vending-machine-web-spring-boot</code> (Spring Boot 4.1.0)</li>
<li><code>006-vending-machine-web-quarkus</code> (Quarkus 3.8.3)</li>
<li><code>007-vending-machine-web-micronaut</code> (Micronaut 4.3.8)</li>
</ol>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="a-shared-core">A Shared Core<a href="https://teaql.io/blog/vending-machine-multi-framework-test#a-shared-core" class="hash-link" aria-label="Direct link to A Shared Core" title="Direct link to A Shared Core">​</a></h2>
<p>At the heart of the test was the <code>java-lib-core</code> module. Regardless of the target web framework, the core library—containing the entities, expressions, checkers, and <code>UserContext</code> definitions—was generated identically.</p>
<p>Because TeaQL encapsulates all relational and structural logic inside the generated <code>SmartList</code>, <code>SearchRequest</code>, and <code>Expression</code> APIs, the upper layer web applications required zero manual translation.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="framework-adaptation">Framework Adaptation<a href="https://teaql.io/blog/vending-machine-multi-framework-test#framework-adaptation" class="hash-link" aria-label="Direct link to Framework Adaptation" title="Direct link to Framework Adaptation">​</a></h2>
<p>The true test was adapting TeaQL's execution engine to the distinct lifecycle and dependency injection models of each framework:</p>
<ul>
<li>In <strong>Spring Boot</strong>, the runtime leveraged <code>SpringJdbcSqlExecutor</code> with <code>NamedParameterJdbcTemplate</code>.</li>
<li>In <strong>Quarkus</strong>, the runtime successfully utilized the framework-neutral <code>teaql-provider-jdbc</code> adapter, binding natively to <code>AgroalDataSource</code> via CDI <code>@Produces</code>.</li>
<li>In <strong>Micronaut</strong>, the application wired the same JDBC adapter using <code>@Singleton</code> definitions and native HikariCP data sources.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="conclusion">Conclusion<a href="https://teaql.io/blog/vending-machine-multi-framework-test#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion">​</a></h2>
<p>All three applications compiled successfully under Java 21, connected to PostgreSQL, and managed to execute complex object-graph saves and reads without any hallucinations or manual SQL intervention.</p>
<p>This multi-framework capability ensures that teams adopting TeaQL are never locked into a single ecosystem. Whether you are building monolithic applications in Spring Boot or deploying lightning-fast native binaries with Quarkus, your data access layer remains pristine, consistent, and strictly aligned with your business intentions.</p>]]></content:encoded>
            <category>teaql</category>
            <category>architecture</category>
            <category>testing</category>
            <category>java</category>
        </item>
        <item>
            <title><![CDATA[TeaQL Java Runtime: Modular Refactor, Multi-Framework Ready, Rust-Aligned]]></title>
            <link>https://teaql.io/blog/java-runtime-modular-refactor</link>
            <guid>https://teaql.io/blog/java-runtime-modular-refactor</guid>
            <pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[We refactored the TeaQL Java runtime (teaql-java) to achieve three goals:]]></description>
            <content:encoded><![CDATA[<p>We refactored the TeaQL Java runtime (<code>teaql-java</code>) to achieve three goals:</p>
<ol>
<li><strong>JPMS module boundaries</strong> — seal internal packages, expose only what generated code needs</li>
<li><strong>Spring Boot independence</strong> — run without Spring Boot using a plain <code>main()</code> function</li>
<li><strong>Rust alignment</strong> — dual-layer audit logging, compile-time query enforcement, <code>RequestPolicy</code></li>
</ol>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="why-refactor">Why Refactor?<a href="https://teaql.io/blog/java-runtime-modular-refactor#why-refactor" class="hash-link" aria-label="Direct link to Why Refactor?" title="Direct link to Why Refactor?">​</a></h2>
<p>The Java runtime had grown organically. All classes lived in flat packages — any code could access <code>RepositoryAdaptor</code>, <code>GLobalResolver</code>, <code>GraphMutationEngine</code>, and other internals. The Rust version had already solved this with proper module boundaries and ownership-based safety. We wanted the same discipline in Java.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="architecture-three-layers">Architecture: Three Layers<a href="https://teaql.io/blog/java-runtime-modular-refactor#architecture-three-layers" class="hash-link" aria-label="Direct link to Architecture: Three Layers" title="Direct link to Architecture: Three Layers">​</a></h2>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">┌──────────────────────────────────────────────────┐</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│ Layer 1: Application                             │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│   Spring Boot App / Plain Java App / Android App │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│   ↕ limited interfaces                           │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├──────────────────────────────────────────────────┤</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│ Layer 2: Generated Code (teaql-code-gen output)  │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│   Entity, Request(Q), Checker, BaseService       │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│   ↕ limited interfaces                           │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├──────────────────────────────────────────────────┤</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│ Layer 3: Runtime (teaql modules)                 │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│   public API + sealed internal implementation     │</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">└──────────────────────────────────────────────────┘</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="jpms-module-boundaries">JPMS Module Boundaries<a href="https://teaql.io/blog/java-runtime-modular-refactor#jpms-module-boundaries" class="hash-link" aria-label="Direct link to JPMS Module Boundaries" title="Direct link to JPMS Module Boundaries">​</a></h2>
<p>We added <code>module-info.java</code> across the Java runtime modules. The core <code>teaql</code> module exports only what generated code needs:</p>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">module io.teaql {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    // === Public API (generated code uses these) ===</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    exports io.teaql.data;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    exports io.teaql.data.checker;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    exports io.teaql.data.criteria;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    exports io.teaql.data.meta;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    exports io.teaql.data.translation;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    exports io.teaql.data.web;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    exports io.teaql.data.value;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    exports io.teaql.data.lock;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    exports io.teaql.data.log;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    // === Sealed internals (precise authorization) ===</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    exports io.teaql.data.repository to io.teaql.sql, io.teaql.memory, io.teaql.sql.portable;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    exports io.teaql.data.internal to io.teaql.autoconfigure, io.teaql.sql;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre></div></div>
<p><strong>Internal packages</strong> stay outside the normal application API surface:</p>
<ul>
<li><code>graph</code> — mutation engine</li>
<li><code>event</code> — event classes</li>
<li><code>xls</code> — Excel export</li>
<li><code>idgenerator</code> — ID generation</li>
<li><code>parser</code> — expression parsers</li>
<li><code>internal</code> — <code>RepositoryAdaptor</code>, <code>GLobalResolver</code>, <code>TempRequest</code></li>
</ul>
<p>Translator implementations under <code>language</code> are public runtime types, with
narrow reflective access where framework integration needs it.</p>
<p>We moved 5 classes from <code>io.teaql.data</code> to <code>io.teaql.data.internal</code>:</p>
<ul>
<li><code>RepositoryAdaptor</code> — graph save orchestrator</li>
<li><code>GLobalResolver</code> — static resolver holder</li>
<li><code>TempRequest</code> — temporary query wrapper</li>
<li><code>RequestAggregationCacheKey</code> — cache key</li>
<li><code>SimpleChineseViewTranslator</code> — internal translator</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="spring-boot-independence">Spring Boot Independence<a href="https://teaql.io/blog/java-runtime-modular-refactor#spring-boot-independence" class="hash-link" aria-label="Direct link to Spring Boot Independence" title="Direct link to Spring Boot Independence">​</a></h2>
<p>We created a <code>TQLResolver</code> interface that replaces Spring's <code>ApplicationContext</code>:</p>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">public interface TQLResolver {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    &lt;T&gt; T getBean(Class&lt;T&gt; clazz);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    &lt;T&gt; List&lt;T&gt; getBeans(Class&lt;T&gt; clazz);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    &lt;T&gt; T getBean(String name);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Repository resolveRepository(String type);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    EntityDescriptor resolveEntityDescriptor(String type);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre></div></div>
<p>For non-Spring environments, a simple <code>Map</code>-based implementation works:</p>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">static class SimpleResolver implements TQLResolver {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    private final Map&lt;Class&lt;?&gt;, Object&gt; beans = new HashMap&lt;&gt;();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    private final Map&lt;String, Repository&lt;?&gt;&gt; repos = new HashMap&lt;&gt;();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    @Override public &lt;T&gt; T getBean(Class&lt;T&gt; clazz) {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        return clazz.cast(beans.get(clazz));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    @Override public Repository resolveRepository(String type) {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        return repos.get(type);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre></div></div>
<p>A robot-kanban demo app runs with a plain <code>main()</code>:</p>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">public static void main(String[] args) {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    DataSource dataSource = createDataSource(); // SQLite</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    EntityMetaFactory metaFactory = new SimpleEntityMetaFactory();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    // ... register metadata, repositories, checkers</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    TQLResolver resolver = new SimpleResolver(metaFactory, repos, checkers, config);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    GLobalResolver.registerResolver(resolver);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    UserContext ctx = new UserContext();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ctx.setRequestPolicy(new PurposeRequestPolicy());</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    ctx.setLogManager(new LogManager());</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    // Use Q/E API</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Q.taskStatuses()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        .comment("查询任务状态")</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        .purpose("展示看板")</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        .executeForList(ctx);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="compile-time-query-enforcement">Compile-Time Query Enforcement<a href="https://teaql.io/blog/java-runtime-modular-refactor#compile-time-query-enforcement" class="hash-link" aria-label="Direct link to Compile-Time Query Enforcement" title="Direct link to Compile-Time Query Enforcement">​</a></h2>
<p>In Rust, you literally cannot call <code>execute_for_list</code> without setting <code>comment</code> — the type system prevents it. In Java, we achieve similar约束 with <code>ExecutableRequest</code>:</p>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">// purpose() is the terminal method — returns ExecutableRequest</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Q.tasks()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    .filterByName("xxx")</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    .comment("查询任务")</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    .purpose("展示看板")     // → ExecutableRequest</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    .executeForList(ctx);    // only ExecutableRequest has this</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// Without purpose(): no ExecutableRequest, no executeForList</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Q.tasks().executeForList(ctx);  // compile error</span><br></span></code></pre></div></div>
<p>The <code>purpose()</code> method validates that <code>comment</code> is set:</p>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">public ExecutableRequest&lt;T&gt; purpose(String purpose) {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    if (comment == null || comment.isEmpty()) {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        throw new RepositoryException(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            "[PURPOSE FAILED] Missing .comment() on " + getTypeName());</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    this.purpose = purpose;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    return new ExecutableRequest&lt;&gt;(this);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="requestpolicy-rust-alignment">RequestPolicy (Rust Alignment)<a href="https://teaql.io/blog/java-runtime-modular-refactor#requestpolicy-rust-alignment" class="hash-link" aria-label="Direct link to RequestPolicy (Rust Alignment)" title="Direct link to RequestPolicy (Rust Alignment)">​</a></h2>
<p>We ported Rust's <code>RequestPolicy</code> trait to Java:</p>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">public interface RequestPolicy {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    default void enforceSelect(UserContext ctx, SearchRequest&lt;?&gt; query) {}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    default void enforceInsert(UserContext ctx, Entity entity) {}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    default void enforceUpdate(UserContext ctx, Entity entity) {}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    default void enforceDelete(UserContext ctx, Entity entity) {}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    default void enforceRecover(UserContext ctx, Entity entity) {}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre></div></div>
<p><code>PurposeRequestPolicy</code> enforces both query purpose and audit comments:</p>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">ctx.setRequestPolicy(new PurposeRequestPolicy());</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// Rejects: no purpose</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Q.taskStatuses().comment("x").executeForList(ctx);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// → [PURPOSE REQUIRED] Query on TaskStatus rejected.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// Rejects: no auditAs</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">entity.save(ctx);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// → [AUDIT REQUIRED] insert on Task rejected.</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="dual-layer-audit--logging">Dual-Layer Audit &amp; Logging<a href="https://teaql.io/blog/java-runtime-modular-refactor#dual-layer-audit--logging" class="hash-link" aria-label="Direct link to Dual-Layer Audit &amp; Logging" title="Direct link to Dual-Layer Audit &amp; Logging">​</a></h2>
<p>The Rust design has two layers: a raw file log controlled by environment variables, and customizable app-level sinks with masked data. We ported this exactly.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="layer-1-runtime-environment-variables-no-code">Layer 1: Runtime (Environment Variables, No Code)<a href="https://teaql.io/blog/java-runtime-modular-refactor#layer-1-runtime-environment-variables-no-code" class="hash-link" aria-label="Direct link to Layer 1: Runtime (Environment Variables, No Code)" title="Direct link to Layer 1: Runtime (Environment Variables, No Code)">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">TEAQL_LOG_ENDPOINT=/var/log/teaql.log  # file path</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">TEAQL_LOG_FORMAT=human                 # human | json</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">TEAQL_LOG_SELECT=true                  # log SELECT queries</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">TEAQL_LOG_MUTATION=true                # log mutations</span><br></span></code></pre></div></div>
<p>Writes <strong>raw, unmasked</strong> SQL and audit information. No code customization.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="layer-2-app-layer-customizable-masked">Layer 2: App Layer (Customizable, Masked)<a href="https://teaql.io/blog/java-runtime-modular-refactor#layer-2-app-layer-customizable-masked" class="hash-link" aria-label="Direct link to Layer 2: App Layer (Customizable, Masked)" title="Direct link to Layer 2: App Layer (Customizable, Masked)">​</a></h3>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">LogManager logManager = new LogManager();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// Audit sink: receives masked events</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">logManager.addAuditSink((ctx, event) -&gt; {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    saveToDatabase(event);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    sendToMessageQueue(event);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">});</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// Log sink: receives masked SQL logs</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">logManager.addLogSink(entry -&gt; {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    showOnUI(entry);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">});</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ctx.setLogManager(logManager);</span><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="masking-aligned-with-rust">Masking (Aligned with Rust)<a href="https://teaql.io/blog/java-runtime-modular-refactor#masking-aligned-with-rust" class="hash-link" aria-label="Direct link to Masking (Aligned with Rust)" title="Direct link to Masking (Aligned with Rust)">​</a></h3>
<p>The masking algorithm matches Rust's <code>mask_audit_value</code> and <code>limit_audit_value</code>:</p>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">// Field-level masking (from EntityDescriptor._audit_mask_fields)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">maskAuditValue("12345678") → "12****78"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">maskAuditValue("1234")     → "****"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// Length truncation (from EntityDescriptor._audit_value_max_len)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">limitAuditValue("very long string...", 200) → "head...tail"</span><br></span></code></pre></div></div>
<p>Configuration comes from the entity model:</p>
<div class="language-xml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-xml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">task_execution_log</span><span class="token tag" style="color:#00009f"></span><br></span><span class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">    </span><span class="token tag attr-name" style="color:#00a4db">_audit_mask_fields</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">detail</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"></span><br></span><span class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">    </span><span class="token tag attr-name" style="color:#00a4db">_audit_value_max_len</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">2048</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"></span><br></span><span class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f"></span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="multi-framework-support-via-teaqldatabase">Multi-Framework Support via TeaQLDatabase<a href="https://teaql.io/blog/java-runtime-modular-refactor#multi-framework-support-via-teaqldatabase" class="hash-link" aria-label="Direct link to Multi-Framework Support via TeaQLDatabase" title="Direct link to Multi-Framework Support via TeaQLDatabase">​</a></h2>
<p>We introduced <code>TeaQLDatabase</code> as the universal database abstraction layer. Portable runtimes share the same SQL repository shape (<code>PortableSQLRepository</code>), only the database driver differs:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Entity → PortableSQLRepository → TeaQLDatabase → Database</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">              ↑                    ↑</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        Reuses SQL building    Abstraction layer</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        (ExpressionHelper)     Android: SQLiteDatabase</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                               Quarkus: AgroalDataSource</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                               Micronaut: DataSource</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                               JVM test: JDBC</span><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="android">Android<a href="https://teaql.io/blog/java-runtime-modular-refactor#android" class="hash-link" aria-label="Direct link to Android" title="Direct link to Android">​</a></h3>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">TeaQLDatabase db = new AndroidDatabase(sqLiteDatabase);</span><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="quarkus-cdi-integration">Quarkus (CDI integration)<a href="https://teaql.io/blog/java-runtime-modular-refactor#quarkus-cdi-integration" class="hash-link" aria-label="Direct link to Quarkus (CDI integration)" title="Direct link to Quarkus (CDI integration)">​</a></h3>
<div class="language-xml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-xml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">dependency</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">groupId</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">io.teaql</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">groupId</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">artifactId</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">teaql-quarkus</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">artifactId</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">dependency</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></span></code></pre></div></div>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">@Inject</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">TeaQLDatabase db;</span><br></span></code></pre></div></div>
<p>The <code>TeaQLProducer</code> provides default beans via CDI <code>@Produces</code>. Application can override any bean.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="micronaut-bean-factory-integration">Micronaut (Bean Factory integration)<a href="https://teaql.io/blog/java-runtime-modular-refactor#micronaut-bean-factory-integration" class="hash-link" aria-label="Direct link to Micronaut (Bean Factory integration)" title="Direct link to Micronaut (Bean Factory integration)">​</a></h3>
<div class="language-xml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-xml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">dependency</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">groupId</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">io.teaql</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">groupId</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">artifactId</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain">teaql-micronaut</span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">artifactId</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">dependency</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></span></code></pre></div></div>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">@Inject</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">TeaQLDatabase db;</span><br></span></code></pre></div></div>
<p>The <code>TeaQLFactory</code> provides default beans via <code>@Factory</code> + <code>@Bean</code>. Application can override any bean.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="plain-java-no-framework">Plain Java (no framework)<a href="https://teaql.io/blog/java-runtime-modular-refactor#plain-java-no-framework" class="hash-link" aria-label="Direct link to Plain Java (no framework)" title="Direct link to Plain Java (no framework)">​</a></h3>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">TeaQLDatabase db = new QuarkusDatabase(dataSource); // or any JDBC DataSource</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">EntityMetaFactory metaFactory = new SimpleEntityMetaFactory();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">// ... register metadata, repositories, checkers</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">TQLResolver resolver = new SimpleResolver(metaFactory, repos, checkers, config);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">GLobalResolver.registerResolver(resolver);</span><br></span></code></pre></div></div>
<p>Key change: <code>ExpressionHelper.toSql()</code> now accepts <code>SQLColumnResolver</code> instead of <code>SQLRepository</code>, so <code>PortableSQLRepository</code> can reuse the expression parsing logic without depending on spring-jdbc.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="summary-table">Summary Table<a href="https://teaql.io/blog/java-runtime-modular-refactor#summary-table" class="hash-link" aria-label="Direct link to Summary Table" title="Direct link to Summary Table">​</a></h2>
<table><thead><tr><th>Feature</th><th>Rust</th><th>Java</th></tr></thead><tbody><tr><td>Module boundaries</td><td>Cargo workspace</td><td>JPMS <code>module-info.java</code></td></tr><tr><td>Query enforcement</td><td>Compile-time (ownership)</td><td><code>ExecutableRequest</code> + <code>purpose()</code></td></tr><tr><td><code>RequestPolicy</code></td><td><code>RequestPolicy</code> trait</td><td><code>RequestPolicy</code> interface</td></tr><tr><td>Audit masking</td><td><code>audit_mask_fields</code> per entity</td><td>Same, via <code>EntityDescriptor</code></td></tr><tr><td>SQL log</td><td><code>LogManager</code> + env vars</td><td>Same</td></tr><tr><td>App sinks</td><td><code>SafeAuditEventSink</code></td><td><code>AuditEventSink</code> + <code>LogSink</code></td></tr><tr><td>Non-Boot runtime</td><td>Native</td><td><code>TQLResolver</code> + <code>SimpleResolver</code></td></tr><tr><td>Android-style portable SQL</td><td>N/A</td><td><code>teaql-sql-portable</code> + <code>TeaQLDatabase</code></td></tr><tr><td>Quarkus support</td><td>N/A</td><td><code>teaql-quarkus</code> + CDI Producer</td></tr><tr><td>Micronaut support</td><td>N/A</td><td><code>teaql-micronaut</code> + Bean Factory</td></tr><tr><td>DB abstraction</td><td><code>TeaQLDatabase</code> trait</td><td><code>TeaQLDatabase</code> interface</td></tr></tbody></table>
<p>The Java runtime is now modular, Spring Boot optional, multi-framework ready (Spring Boot / Quarkus / Micronaut / Android / Plain Java), and aligned with the Rust architecture on all critical design points.</p>]]></content:encoded>
            <category>java</category>
            <category>architecture</category>
            <category>android</category>
            <category>quarkus</category>
            <category>micronaut</category>
            <category>modules</category>
            <category>audit</category>
            <category>rust-alignment</category>
        </item>
        <item>
            <title><![CDATA[TeaQL Evaluation Report 001: Why We Publish the Evidence]]></title>
            <link>https://teaql.io/blog/teaql-evaluation-report-001</link>
            <guid>https://teaql.io/blog/teaql-evaluation-report-001</guid>
            <pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[TeaQL's first public autonomous evaluation report is a step toward making AI coding inspectable, reproducible, and accountable.]]></description>
            <content:encoded><![CDATA[<p>TeaQL Evaluation Report 001 is now available. We are publishing it together with the raw evaluation data because AI coding for business software should be inspectable, not only demonstrated.</p>
<p>Business software has a different risk profile from a small demo. It carries business rules, audit requirements, data boundaries, operational workflows, and long-lived maintenance obligations. If an AI coding agent works in that environment, the important question is not only whether it can produce code once. The important question is whether its work can be measured, reviewed, and traced back to evidence.</p>
<p>That is why this report exists.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-this-report-is">What This Report Is<a href="https://teaql.io/blog/teaql-evaluation-report-001#what-this-report-is" class="hash-link" aria-label="Direct link to What This Report Is" title="Direct link to What This Report Is">​</a></h2>
<p>Report 001 is our first public autonomous evaluation report for TeaQL agent workflows. It looks at how an AI coding agent behaves when working against TeaQL's generated business API surface and evaluation materials.</p>
<p>The report is not presented as a universal industry benchmark. It is an early, public, reproducible evaluation artifact for TeaQL's own agent-facing approach. Its value is in the evidence it exposes:</p>
<ul>
<li>the tasks being evaluated</li>
<li>the agent behavior observed during the run</li>
<li>the measured outcomes</li>
<li>the failure patterns</li>
<li>the lessons for stronger guardrails and better agent workflows</li>
</ul>
<p>That evidence matters more than a single success story.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="why-publish-reports">Why Publish Reports<a href="https://teaql.io/blog/teaql-evaluation-report-001#why-publish-reports" class="hash-link" aria-label="Direct link to Why Publish Reports" title="Direct link to Why Publish Reports">​</a></h2>
<p>AI coding tools can look convincing when the output is shown without context. For business software, that is not enough. Teams need to understand how the result was produced, where the agent stayed inside the intended API boundary, where it drifted, and what kinds of mistakes still require evaluation and review.</p>
<p>TeaQL is designed around that premise. Generated APIs, structured model information, audit-aware operations, and evaluation workflows should make agent work easier to inspect. Publishing evaluation reports is a way to apply the same discipline to TeaQL itself.</p>
<p>The PDF is the readable summary. The raw data is the evidence trail.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="how-to-read-it">How To Read It<a href="https://teaql.io/blog/teaql-evaluation-report-001#how-to-read-it" class="hash-link" aria-label="Direct link to How To Read It" title="Direct link to How To Read It">​</a></h2>
<p>Readers do not need to treat the report as marketing material. A better way to read it is as an engineering artifact:</p>
<ol>
<li>Start with the task definitions.</li>
<li>Check what the agent actually produced.</li>
<li>Compare the result against the intended TeaQL API boundary.</li>
<li>Look at the evaluation notes and failure patterns.</li>
<li>Use the raw data to verify the summary instead of trusting the summary alone.</li>
</ol>
<p>This is also how we want TeaQL adoption to work: not by hiding complexity, but by making the important parts reviewable.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-comes-next">What Comes Next<a href="https://teaql.io/blog/teaql-evaluation-report-001#what-comes-next" class="hash-link" aria-label="Direct link to What Comes Next" title="Direct link to What Comes Next">​</a></h2>
<p>Report 001 is only a first step. Future evaluations should cover more tasks, more agent tools, more models, and clearer comparisons across time. The goal is not to claim that autonomous coding is solved. The goal is to make progress visible, repeatable, and honest enough for serious software teams to reason about.</p>
<p>You can read the report here:</p>
<ul>
<li>
<a href="https://teaql.io/evaluation/reports/teaql-evaluation-report-001.pdf" download="">Download TeaQL Evaluation Report 001</a>
</li>
<li>
<a href="https://github.com/teaql/teaql-agent-kit/tree/autonomous/evaluation-report-001/raw" target="_blank" rel="noreferrer">View the raw evaluation data</a>
</li>
</ul>]]></content:encoded>
            <category>teaql</category>
            <category>evaluation</category>
            <category>ai-coding</category>
            <category>report</category>
        </item>
        <item>
            <title><![CDATA[Unveiling TeaQL Architecture: Declarative Multi-Destination Data Service Routing — Farewell to the 'Glue Code' of Polyglot Persistence]]></title>
            <link>https://teaql.io/blog/declarative-data-service-routing</link>
            <guid>https://teaql.io/blog/declarative-data-service-routing</guid>
            <pubDate>Sat, 06 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[In modern complex application architectures, polyglot persistence has almost become a standard configuration. Within a single system, core transactional data may require PostgreSQL for strong consistency guarantees, massive execution logs might need Meilisearch for full-text search, state information could be thrown into Redis for ultra-high-speed caching, and local development might even downgrade to rusqlite.]]></description>
            <content:encoded><![CDATA[<p>In modern complex application architectures, <strong>polyglot persistence</strong> has almost become a standard configuration. Within a single system, core transactional data may require PostgreSQL for strong consistency guarantees, massive execution logs might need Meilisearch for full-text search, state information could be thrown into Redis for ultra-high-speed caching, and local development might even downgrade to rusqlite.</p>
<p>However, while enjoying the ultimate performance of multi-destination storage, we often find ourselves trapped in a painful "code swamp."</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="1-the-pain-points-the-schizophrenia-of-multiple-data-sources-and-ai-disasters">1. The Pain Points: The "Schizophrenia" of Multiple Data Sources and AI Disasters<a href="https://teaql.io/blog/declarative-data-service-routing#1-the-pain-points-the-schizophrenia-of-multiple-data-sources-and-ai-disasters" class="hash-link" aria-label="Direct link to 1. The Pain Points: The &quot;Schizophrenia&quot; of Multiple Data Sources and AI Disasters" title="Direct link to 1. The Pain Points: The &quot;Schizophrenia&quot; of Multiple Data Sources and AI Disasters">​</a></h2>
<p>If you implement such polyglot persistence using traditional architectures, your business code will typically be littered with scenarios like this:</p>
<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Traditional business logic Frankenstein</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> entity</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">is_task</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    pg_pool</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">execute</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"INSERT INTO task..."</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">task</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword" style="color:#00009f">await</span><span class="token operator" style="color:#393A34">?</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">else</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> entity</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">is_execution_log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    meilisearch_client</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">index</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"task_execution_log"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">add_documents</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">log</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword" style="color:#00009f">await</span><span class="token operator" style="color:#393A34">?</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>We have to configure multiple connection pools, introduce multiple ORMs or SDKs, and even write hundreds of lines of IF/ELSE blocks in the business logic just to keep the data synchronized.</p>
<p><strong>In the era of AI-assisted programming (Agentic Coding), this architecture is extremely unfriendly to AI.</strong>
If an AI Agent needs to navigate such a codebase, it must simultaneously master the API syntax of multiple underlying databases. With the slightest mistake, it will mix up Postgres syntax with the Meilisearch SDK, generating disastrous code hallucinations. Not to mention, when the architecture evolves and you want to migrate an entity from MySQL to Elasticsearch, the related business logic often faces the risk of being completely scrapped and rewritten.</p>
<p>We need an ultimate solution <strong>designed for Agents</strong>.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="2-teaqls-solution-the-underscore-philosophy-and-inheritance-mechanism">2. TeaQL's Solution: The "Underscore Philosophy" and "Inheritance Mechanism"<a href="https://teaql.io/blog/declarative-data-service-routing#2-teaqls-solution-the-underscore-philosophy-and-inheritance-mechanism" class="hash-link" aria-label="Direct link to 2. TeaQL's Solution: The &quot;Underscore Philosophy&quot; and &quot;Inheritance Mechanism&quot;" title="Direct link to 2. TeaQL's Solution: The &quot;Underscore Philosophy&quot; and &quot;Inheritance Mechanism&quot;">​</a></h2>
<p>In the TeaQL framework, we adhere strictly to the philosophy of "<strong>Model as the Single Source of Truth</strong>". How do we elegantly resolve routing across multiple data services? We compress all the complexity into the system core, leaving only a simple multiple-choice question for developers (or AI) in the XML model file.</p>
<p>Let's look at how a TeaQL model defines the destination of data storage:</p>
<div class="language-xml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-xml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">&lt;!-- 1. Global configuration: Define the overall data_service on the root node. The entire domain defaults to rusqlite. --&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">root</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">name</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">robot-kanban-service</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">org</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">doublechaintech</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">data_service</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">rusqlite</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">&lt;!-- 2. Default inheritance: No data service declared here; automatically inherits rusqlite from root to go to relational storage. --&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">task</span><span class="token tag" style="color:#00009f"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">        </span><span class="token tag attr-name" style="color:#00a4db">name</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">string()</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">        </span><span class="token tag attr-name" style="color:#00a4db">status</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">string()</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"></span><br></span><span class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">    </span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">&lt;!-- 3. Local override: Business requires logs to support full-text search, so we explicitly switch to meilisearch via _data_service. --&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">task_execution_log</span><span class="token tag" style="color:#00009f"></span><br></span><span class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">        </span><span class="token tag attr-name" style="color:#00a4db">action</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">string()</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"></span><br></span><span class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">        </span><span class="token tag attr-name" style="color:#00a4db">detail</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">string()</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"></span><br></span><span class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">        </span><span class="token tag attr-name" style="color:#00a4db">_data_service</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">meilisearch</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">    </span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag" style="color:#00009f">root</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="why-the-underscore">Why the "Underscore"?<a href="https://teaql.io/blog/declarative-data-service-routing#why-the-underscore" class="hash-link" aria-label="Direct link to Why the &quot;Underscore&quot;?" title="Direct link to Why the &quot;Underscore&quot;?">​</a></h3>
<p>Hidden here is a core syntax design of the TeaQL parser: <strong>distinguishing business data fields from framework metadata</strong>.</p>
<ul>
<li>Attributes without an underscore (such as <code>name="string()"</code> or <code>data_service</code> on the root node) are treated by the parser as business-level <strong>entity data fields (Fields)</strong>.</li>
<li>Attributes prefixed with an underscore (such as <code>_data_service</code> or <code>_audit_mask_fields</code>) represent <strong>metadata (Metadata)</strong> that controls framework behavior.</li>
</ul>
<p>If we wrote <code>data_service="meilisearch"</code> without the underscore on <code>&lt;task_execution_log&gt;</code>, the parser would assume that the task has a business field named <code>data_service</code>! Through this ultra-minimal underscore convention, we achieve complete decoupling of business and framework configuration without breaking the purity of the XML at all.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="3-architectural-magic-transparent-dispatching-under-the-hood">3. Architectural Magic: Transparent Dispatching Under the Hood<a href="https://teaql.io/blog/declarative-data-service-routing#3-architectural-magic-transparent-dispatching-under-the-hood" class="hash-link" aria-label="Direct link to 3. Architectural Magic: Transparent Dispatching Under the Hood" title="Direct link to 3. Architectural Magic: Transparent Dispatching Under the Hood">​</a></h2>
<p>When the generator scans the model above, it reads <code>_data_service</code> and passes the context to the STG templates. The final entity code generated on the Rust side looks like this:</p>
<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token attribute attr-name" style="color:#00a4db">#[derive(Clone, Debug, PartialEq, TeaqlEntity)]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// The macro is injected with data_service = "meilisearch"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token attribute attr-name" style="color:#00a4db">#[teaql(entity = </span><span class="token attribute attr-name string" style="color:#e3116c">"TaskExecutionLog"</span><span class="token attribute attr-name" style="color:#00a4db">, table = </span><span class="token attribute attr-name string" style="color:#e3116c">"task_execution_log_data"</span><span class="token attribute attr-name" style="color:#00a4db">, data_service = </span><span class="token attribute attr-name string" style="color:#e3116c">"meilisearch"</span><span class="token attribute attr-name" style="color:#00a4db">)]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token type-definition class-name">TaskExecutionLog</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">...</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p><strong>What magic does this bring to the business-layer code?</strong>
No matter where the underlying tables actually reside, the business-layer developers and AI see only one interface: a unified, elegant TeaQL domain-specific language API.</p>
<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Business code: Saving a task automatically routes to rusqlite under the hood</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> task </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Task</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">new</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Deploy App"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ctx</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">save</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">task</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword" style="color:#00009f">await</span><span class="token operator" style="color:#393A34">?</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Business code: Saving a log automatically invokes the Meilisearch Provider SDK under the hood</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> log </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">TaskExecutionLog</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">new</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"System start"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ctx</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">save</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">log</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword" style="color:#00009f">await</span><span class="token operator" style="color:#393A34">?</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p>No "glue code", no ugly conditional branches. Through the underlying Rust Trait mechanism (Providers), <code>ctx.save()</code> acts like a smart mail sorting station, accurately dispatching data to its proper place based on the <code>data_service</code> label attached to each entity's head.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="4-the-pinnacle-of-agentic-coding-reducing-cognitive-load">4. The Pinnacle of Agentic Coding: Reducing Cognitive Load<a href="https://teaql.io/blog/declarative-data-service-routing#4-the-pinnacle-of-agentic-coding-reducing-cognitive-load" class="hash-link" aria-label="Direct link to 4. The Pinnacle of Agentic Coding: Reducing Cognitive Load" title="Direct link to 4. The Pinnacle of Agentic Coding: Reducing Cognitive Load">​</a></h2>
<p>Under an architecture like TeaQL:</p>
<ol>
<li><strong>Preventing Human Error:</strong> Business developers will never write data to the wrong database due to mistakenly calling the wrong connection pool.</li>
<li><strong>Unleashing AI Potential:</strong> When generating complex business logic flows, AI no longer needs to read the API manuals of various data components.</li>
</ol>
<p>We have split "architectural decision-making" and "business coding" into their most logical stages. During the modeling phase, the AI or architect determines the physical layer direction with a single <code>_data_service</code> attribute; during the coding phase, no matter what business logic code is generated, the underlying layer maintains absolute consistency and security.</p>
<p>A truly excellent modern framework must not only serve humans but also understand how to elegantly guide AI collaboration. TeaQL is a pioneering work born exactly from this philosophy.</p>]]></content:encoded>
            <category>architecture</category>
            <category>agentic-coding</category>
            <category>data-service</category>
            <category>rust</category>
        </item>
        <item>
            <title><![CDATA[Kernel-Level Audit & Privacy: Building Resilient Audit Chains in the AI Coding Era]]></title>
            <link>https://teaql.io/blog/kernel-level-audit-in-ai-coding-era</link>
            <guid>https://teaql.io/blog/kernel-level-audit-in-ai-coding-era</guid>
            <pubDate>Sat, 06 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[In the era of AI Coding, business code may be co-generated and modified by human developers, AI agents, or automated tools.]]></description>
            <content:encoded><![CDATA[<p>In the era of AI Coding, business code may be co-generated and modified by human developers, AI agents, or automated tools.
This brings a new challenge:</p>
<blockquote>
<p><strong>While business logic is becoming increasingly easy to generate automatically, the audit chain must not become fragile as a result.</strong></p>
</blockquote>
<p>Traditional audit systems often rely on business code to actively record logs. However, in AI Coding scenarios, this approach carries clear risks:</p>
<ul>
<li>AI might forget to write audit logs;</li>
<li>AI might accidentally disable logs;</li>
<li>AI might generate code that bypasses audits;</li>
<li>Business code might unintentionally record sensitive plain text;</li>
<li>A <code>custom audit hook</code> might access raw data it shouldn't see;</li>
<li>Long strings, JSON payloads, or execution logs might cause audit log bloating or even out-of-memory (OOM) errors.</li>
</ul>
<p>Therefore, TeaQL underwent a low-level refactoring to move auditing capabilities into the framework kernel rather than leaving them entirely to the business code. We established the following core principles:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Audit must be kernel-level.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Business code may enrich audit trails, but it cannot erase them.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Sensitive fields do not disappear; only their plain text disappears.</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="1-kernel-level-auditing-to-prevent-mistakes-automatically">1. Kernel-Level Auditing to Prevent Mistakes Automatically<a href="https://teaql.io/blog/kernel-level-audit-in-ai-coding-era#1-kernel-level-auditing-to-prevent-mistakes-automatically" class="hash-link" aria-label="Direct link to 1. Kernel-Level Auditing to Prevent Mistakes Automatically" title="Direct link to 1. Kernel-Level Auditing to Prevent Mistakes Automatically">​</a></h2>
<p>Humans don't have the energy to make every possible mistake; our primary targets for defense are actually AI and automatically generated code. If an AI can write business logic, it is equally capable of mistakenly wiping out the audit chain or unintentionally logging sensitive plain text (such as passwords, tokens, etc.).</p>
<p>To guard against this, the TeaQL auditing system cannot be altered arbitrarily from the outside. In the TeaQL Rust Runtime, every data mutation (Insert/Update/Delete) is automatically triggered by the kernel.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="dual-channel-design-isolating-internal-auditing-from-custom-hooks">Dual-Channel Design: Isolating Internal Auditing from Custom Hooks<a href="https://teaql.io/blog/kernel-level-audit-in-ai-coding-era#dual-channel-design-isolating-internal-auditing-from-custom-hooks" class="hash-link" aria-label="Direct link to Dual-Channel Design: Isolating Internal Auditing from Custom Hooks" title="Direct link to Dual-Channel Design: Isolating Internal Auditing from Custom Hooks">​</a></h3>
<p>In previous versions, we provided a unified <code>ctx.set_event_sink()</code>, but this introduced conflicts. If a client overrode the sink to implement WebSocket push notifications, the infrastructure-level compliance audit logs would be lost.</p>
<p>To solve this, we strictly isolate internal system auditing from custom external user hooks:</p>
<ol>
<li><strong>Immutable Internal Auditing (Raw Event Sink)</strong>:
<code>set_event_sink</code> has been demoted to a <code>pub(crate)</code> internal behavior and is controlled solely by environment variables (e.g., <code>TEAQL_AUDIT_ENABLED</code>). AI-generated business code or client-side code <strong>can never</strong> modify or disable internal compliance auditing.</li>
<li><strong>Secure External Customization (Custom Event Sink)</strong>:
We provide a clear public API: <code>ctx.set_custom_event_sink()</code>. This is the sole hook left open to the outside, allowing users to intercept log messages and perform further business processing (such as updating the UI in our robot kanban demo).</li>
</ol>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="2-the-evolution-from-rawauditevent-to-safeauditevent">2. The Evolution from RawAuditEvent to SafeAuditEvent<a href="https://teaql.io/blog/kernel-level-audit-in-ai-coding-era#2-the-evolution-from-rawauditevent-to-safeauditevent" class="hash-link" aria-label="Direct link to 2. The Evolution from RawAuditEvent to SafeAuditEvent" title="Direct link to 2. The Evolution from RawAuditEvent to SafeAuditEvent">​</a></h2>
<p>Isolating the sinks is not enough on its own. While internal compliance audits can write directly to databases or log collectors, <strong>events exposed to the external custom sink must be safe</strong>.</p>
<p>If we were to pass the complete raw event stream to a custom sink, it would mean client code or AI-generated logic could easily access raw sensitive data they shouldn't see, or crash the memory with bloated text.</p>
<p>To completely solve this, we split the event model into two layers:</p>
<ol>
<li><code>RawAuditEvent</code>: Contains 100% complete mutation data and raw requests, <strong>restricted for internal low-level use only</strong>.</li>
<li><code>SafeAuditEvent</code>: A sanitized, masked, and truncated event model <strong>exposed to the outside</strong>.</li>
</ol>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="metadata-based-automatic-masking-and-truncation">Metadata-Based Automatic Masking and Truncation<a href="https://teaql.io/blog/kernel-level-audit-in-ai-coding-era#metadata-based-automatic-masking-and-truncation" class="hash-link" aria-label="Direct link to Metadata-Based Automatic Masking and Truncation" title="Direct link to Metadata-Based Automatic Masking and Truncation">​</a></h3>
<p>The core philosophy of TeaQL is: <strong>Model is the Single Source of Truth.</strong>
By adding specific metadata attributes in the XML model, the code generator automatically generates Rust data structure descriptors (<code>EntityDescriptor</code>) containing safety policies.</p>
<p>In the latest <code>model.xml</code>, developers can define masking and truncation rules directly on the Entity:</p>
<div class="language-xml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-xml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">task_execution_log</span><span class="token tag" style="color:#00009f"></span><br></span><span class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">    </span><span class="token tag attr-name" style="color:#00a4db">task</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">task()</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"></span><br></span><span class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">    </span><span class="token tag attr-name" style="color:#00a4db">action</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">string()</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"></span><br></span><span class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">    </span><span class="token tag attr-name" style="color:#00a4db">detail</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">string()</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"></span><br></span><span class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">    </span><span class="token tag attr-name" style="color:#00a4db">_audit_mask_fields</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">detail</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"></span><br></span><span class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">    </span><span class="token tag attr-name" style="color:#00a4db">_audit_value_max_len</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">2048</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"></span><br></span><span class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">    </span><span class="token tag attr-name" style="color:#00a4db">_data_service</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">meilisearch</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"></span><br></span><span class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">    </span><span class="token tag attr-name" style="color:#00a4db">_name</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">Task Execution Log</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"></span><br></span><span class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f"></span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><br></span></code></pre></div></div>
<p>When a <code>RawAuditEvent</code> is passed to the <code>CustomEventSink</code>, the kernel-space <code>UserContext</code> retrieves the security descriptor for the corresponding entity via the <code>MetadataStore</code> and converts the <code>RawAuditEvent</code> into a <code>SafeAuditEvent</code> (a lock-free, highly efficient conversion process).</p>
<p>This conversion process automatically performs two core defenses:</p>
<ol>
<li>
<p><strong>Field-Level Masking</strong>:
If a field is listed in <code>_audit_mask_fields</code> (such as passwords or sensitive content), TeaQL <strong>does not</strong> delete the field from the audit record. Instead, it replaces its value with <code>*** MASKED ***</code>. This preserves the principle that "sensitive fields do not disappear; only their plain text disappears," keeping the audit trail intact.</p>
</li>
<li>
<p><strong>Automatic Long-Text Truncation</strong>:
If a field contains a multi-megabyte JSON payload or error stack, sending it directly to an external hook could trigger an OOM error. TeaQL automatically truncates long strings in the safe event to a specified length based on <code>_audit_value_max_len</code>, appending <code>...(truncated)</code>.</p>
</li>
</ol>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="3-preventative-design-in-modeling-a-fail-fast-linter-for-ai">3. Preventative Design in Modeling: A Fail-Fast Linter for AI<a href="https://teaql.io/blog/kernel-level-audit-in-ai-coding-era#3-preventative-design-in-modeling-a-fail-fast-linter-for-ai" class="hash-link" aria-label="Direct link to 3. Preventative Design in Modeling: A Fail-Fast Linter for AI" title="Direct link to 3. Preventative Design in Modeling: A Fail-Fast Linter for AI">​</a></h2>
<p>Kernel-level interception at runtime is not enough. If an AI or developer <strong>forgets</strong> to add the <code>_audit_mask_fields</code> tag to highly sensitive fields like <code>password</code> or <code>ssn</code> during the modeling phase (when writing XML), plain text would still leak at runtime.</p>
<p>To address this, we have natively integrated a <strong>KSML Static Analysis and Evaluation Linter</strong> into the compile and code generation phase of TeaQL.</p>
<p>When a model is submitted to the framework, the <code>PrivacyAuditEvaluationRule</code> automatically performs lexical evaluations on all fields. Built specifically for Agentic Coding, this mechanism supports "fail-fast and self-healing":</p>
<ol>
<li><strong>Blocking Errors (Error)</strong>: When core high-risk privacy fields (like <code>password</code>, <code>token</code>, or <code>ssn</code>) are detected without masking, the engine <strong>blocks code generation</strong>.</li>
<li><strong>Actionable Fix Examples</strong>: The engine no longer throws cold stack traces; instead, it outputs clear snippets showing how to fix the issue. Whether a human is viewing the CLI or an AI is parsing a JSON response, they receive precise instructions:<!-- -->
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"ruleId"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"KSML-PRIVACY-001-ERR"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"title"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"High Sensitivity Data Unmasked"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"message"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"The field 'password' in entity 'user' contains highly sensitive keywords. You MUST mask it.\nFix Example: Update your XML entity definition:\n&lt;user ... _audit_mask_fields=\"password\" /&gt;"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
</li>
<li><strong>Soft Warnings &amp; Suggestions</strong>: For secondary sensitive fields like <code>user_email</code> or <code>phone</code>, the system does not block generation but packages warnings into <code>.teaql/evaluation_report.json</code>. The IDE plugin or an AI's subsequent task can read this report to display warning lines in the XML editor.</li>
</ol>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="conclusion">Conclusion<a href="https://teaql.io/blog/kernel-level-audit-in-ai-coding-era#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion">​</a></h2>
<p>With the rise of AI Coding, <strong>defensive design</strong> is no longer just about protecting against human typos—it's about keeping automated systems from running out of control in edge cases.</p>
<p>By (1) isolating the immutable compliance sink and (2) introducing the <code>SafeAuditEvent</code> automatically sanitized via model metadata, TeaQL builds an impassable barrier: <strong>no matter what business code the AI generates, it can never bypass audit baselines, nor can it accidentally leak sensitive data.</strong></p>]]></content:encoded>
            <category>rust</category>
            <category>architecture</category>
            <category>security</category>
            <category>audit</category>
            <category>developer-experience</category>
            <category>ai</category>
        </item>
        <item>
            <title><![CDATA[The Return of E Expressions: Fluent Chaining and Structured Panics for AI Auto-Healing]]></title>
            <link>https://teaql.io/blog/returning-to-e-expressions-with-structured-panics</link>
            <guid>https://teaql.io/blog/returning-to-e-expressions-with-structured-panics</guid>
            <pubDate>Sat, 06 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[In the evolution of TeaQL, we've constantly navigated the tension between developer ergonomics and idiomatic Rust. Recently, we made a bold decision: fluent expression chain to Rust.]]></description>
            <content:encoded><![CDATA[<p>In the evolution of TeaQL, we've constantly navigated the tension between developer ergonomics and idiomatic Rust. Recently, we made a bold decision: we are bringing back the beloved <code>E::</code> fluent expression chain to Rust.</p>
<p>But this isn't a simple rollback. We've redesigned it from the ground up with zero-cost reference chaining and introduced a revolutionary structured panic mechanism that turns runtime errors into self-healing instructions for AI agents.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-ping-pong-of-api-design">The Ping-Pong of API Design<a href="https://teaql.io/blog/returning-to-e-expressions-with-structured-panics#the-ping-pong-of-api-design" class="hash-link" aria-label="Direct link to The Ping-Pong of API Design" title="Direct link to The Ping-Pong of API Design">​</a></h2>
<p>Early in our Rust port, we attempted to replicate Java's <code>E::</code> expression wrappers. However, to satisfy the borrow checker without complex lifetime annotations, we ended up requiring <code>.clone()</code> on entire entity graphs. This was unacceptable in Rust.</p>
<p>Our first reaction was to swing the pendulum the other way. We introduced <code>eval_xxx()</code> methods and the <code>EvalResult</code> enum, forcing developers to use combinators like <code>.and_then()</code> to safely traverse graphs:</p>
<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> result </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> user</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">eval_platform</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">and_then</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"platform"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token closure-params closure-punctuation punctuation" style="color:#393A34">|</span><span class="token closure-params">p</span><span class="token closure-params closure-punctuation punctuation" style="color:#393A34">|</span><span class="token plain"> p</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">eval_company</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">and_then</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"company"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token closure-params closure-punctuation punctuation" style="color:#393A34">|</span><span class="token closure-params">c</span><span class="token closure-params closure-punctuation punctuation" style="color:#393A34">|</span><span class="token plain"> c</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">eval_name</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p>While this was memory-safe and zero-cost, it destroyed the developer experience. As we often say: <strong>"Fluent expressions are mental candy for humans."</strong> Writing deeply nested closures just to read a nested property felt punishing.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="bringing-back-e-the-right-way">Bringing Back <code>E::</code> (The Right Way)<a href="https://teaql.io/blog/returning-to-e-expressions-with-structured-panics#bringing-back-e-the-right-way" class="hash-link" aria-label="Direct link to bringing-back-e-the-right-way" title="Direct link to bringing-back-e-the-right-way">​</a></h2>
<p>We realized we could have our cake and eat it too. By carefully crafting lifetime-bound wrapper structs in the code generator, we brought back the <code>E::</code> syntax without any of the <code>.clone()</code> overhead.</p>
<p>You can now write fluent chains in multiple ways depending on your error-handling preference:</p>
<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// 1. Strict evaluation (Panics with structured AI diagnostic if missing)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> name </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">E</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">user</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">user</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">get_platform</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">get_company</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">get_name</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">unwrap</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// 2. Safe Optional evaluation (Returns None if logically missing or naturally Null)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> </span><span class="token class-name">Some</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">name</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">E</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">user</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">user</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">get_platform</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">get_company</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">get_name</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">eval</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token macro property" style="color:#36acaa">println!</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Found name: {}"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> name</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// 3. Fluent fallback (Provides a default if missing or Null)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> name </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">E</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">user</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">user</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">get_platform</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">get_company</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">get_name</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">or_else</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Unknown Company"</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">to_string</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p>Under the hood, all of these are zero-cost abstractions that simply pass references along the chain until the final terminator (<code>unwrap</code>, <code>eval</code>, or <code>or_else</code>) is called.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="strict-panics-rusts-bottom-line">Strict Panics: Rust's Bottom Line<a href="https://teaql.io/blog/returning-to-e-expressions-with-structured-panics#strict-panics-rusts-bottom-line" class="hash-link" aria-label="Direct link to Strict Panics: Rust's Bottom Line" title="Direct link to Strict Panics: Rust's Bottom Line">​</a></h2>
<p>But what happens if you try to traverse a relation that wasn't loaded from the database? In Java, you might get a silent null or a late <code>NullPointerException</code>. In our previous <code>eval_xxx</code> iteration, you got a safe <code>EvalResult::NotLoaded</code> enum.</p>
<p>With the return of <code>E::</code>, we decided to embrace a core Rust philosophy: <strong>Fail fast and fail loudly.</strong></p>
<p>If you access an unloaded relation, the expression evaluates to a panic. But this is not your typical panic. It is a <strong>Structured Logic Bug Panic</strong>.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="designing-for-ai-the-structured-panic">Designing for AI: The Structured Panic<a href="https://teaql.io/blog/returning-to-e-expressions-with-structured-panics#designing-for-ai-the-structured-panic" class="hash-link" aria-label="Direct link to Designing for AI: The Structured Panic" title="Direct link to Designing for AI: The Structured Panic">​</a></h2>
<p>When building AI-native frameworks, errors shouldn't just halt execution; they should provide the exact recipe to fix the bug.</p>
<p>When an <code>E::</code> expression encounters an unloaded relation, it triggers a highly structured diagnostic panic that looks like this:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">================================================================================</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">☕ TeaQL Logic Bug Detected ☕</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Severity: FATAL - System halted to prevent undefined business logic.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[Human Message]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">You attempted to access a relation that was not loaded in the initial query.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Root Entity: User(id=42)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Attempted Path: platform.company.name</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[Diagnostic Context]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">original_expr_with_broken_point: E::user(id=42).get_platform().get_company()&lt;broken&gt;.get_name()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">missing_preload: select_company()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">suggested_fix: .select_platform_with(Q::platforms().select_company())</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">================================================================================</span><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="the-magic-of-broken">The Magic of <code>&lt;broken&gt;</code><a href="https://teaql.io/blog/returning-to-e-expressions-with-structured-panics#the-magic-of-broken" class="hash-link" aria-label="Direct link to the-magic-of-broken" title="Direct link to the-magic-of-broken">​</a></h3>
<p>The most crucial addition here is the <code>original_expr_with_broken_point</code> field. By injecting a visual <code>&lt;broken&gt;</code> marker exactly where the chain failed, we provide immense context.</p>
<p>When an AI agent (like our coding assistants) runs a test and hits this panic, it doesn't need to guess where the data is missing. It reads the structured payload, spots the <code>&lt;broken&gt;</code> marker, and immediately knows that the <code>company</code> relation needs to be loaded. It even gets the exact <code>suggested_fix</code> to append to its query builder.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="conclusion">Conclusion<a href="https://teaql.io/blog/returning-to-e-expressions-with-structured-panics#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion">​</a></h2>
<p>By combining zero-cost reference wrappers with highly structured, AI-readable panics, we've achieved the holy grail of framework design:</p>
<ol>
<li><strong>Human Ergonomics:</strong> Developers get the "mental candy" of fluent <code>.get_foo().get_bar()</code> chaining.</li>
<li><strong>Performance:</strong> Zero allocations, purely reference-driven.</li>
<li><strong>AI Auto-Healing:</strong> When things break, the framework hands the AI the exact instructions needed to rewrite its query and heal the code automatically.</li>
</ol>
<p>In the AI era, an error is no longer a dead end—it's just a prompt for the next self-correction.</p>]]></content:encoded>
            <category>rust</category>
            <category>architecture</category>
            <category>ai-native</category>
            <category>orm</category>
            <category>teaql</category>
            <category>developer-experience</category>
        </item>
        <item>
            <title><![CDATA[Expanding the TeaQL Ecosystem: Seamless Integration with Axum Web and Redis Distributed Cache]]></title>
            <link>https://teaql.io/blog/teaql-ecosystem-web-and-redis-modules</link>
            <guid>https://teaql.io/blog/teaql-ecosystem-web-and-redis-modules</guid>
            <pubDate>Sat, 06 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[As the core architecture of TeaQL continues to mature, we are excited to announce two heavy-weight extension modules to the TeaQL ecosystem: the Web Module (teaql-web-integration-axum) and the Red Module (teaql-cache-integration-redis).]]></description>
            <content:encoded><![CDATA[<p>As the core architecture of TeaQL continues to mature, we are excited to announce two heavy-weight extension modules to the TeaQL ecosystem: the <strong>Web Module (<code>teaql-web-integration-axum</code>)</strong> and the <strong>Red Module (<code>teaql-cache-integration-redis</code>)</strong>.</p>
<p>The addition of these two modules marks a significant milestone. TeaQL not only excels at the low-level data flow and auditing but also starts to provide out-of-the-box, exceptional experiences for developers and AI agents in top-level web request routing and distributed scaling.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="1-the-web-module-bridging-the-http-layer-and-the-security-sandbox">1. The Web Module: Bridging the HTTP Layer and the Security Sandbox<a href="https://teaql.io/blog/teaql-ecosystem-web-and-redis-modules#1-the-web-module-bridging-the-http-layer-and-the-security-sandbox" class="hash-link" aria-label="Direct link to 1. The Web Module: Bridging the HTTP Layer and the Security Sandbox" title="Direct link to 1. The Web Module: Bridging the HTTP Layer and the Security Sandbox">​</a></h2>
<p>In traditional architectures, the web layer (controllers/routing) and the underlying business logic layer are often completely disconnected. Developers must manually extract tokens, trace IDs, and User-Agents from HTTP headers, then assemble and pass them down to the service layer.</p>
<p><strong><code>teaql-web-integration-axum</code></strong> changes this completely. It seamlessly integrates the Rust community's outstanding Axum web framework with TeaQL's core security sandbox (<code>UserContext</code>).</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="feature-1-teacontext-extractor">Feature 1: TeaContext Extractor<a href="https://teaql.io/blog/teaql-ecosystem-web-and-redis-modules#feature-1-teacontext-extractor" class="hash-link" aria-label="Direct link to Feature 1: TeaContext Extractor" title="Direct link to Feature 1: TeaContext Extractor">​</a></h3>
<p>We implemented a native Axum extractor in the Web module. When a request hits your router, all critical metadata is automatically parsed from the HTTP message and encapsulated into a high-integrity, tamper-proof <code>UserContext</code>:</p>
<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Axum router handler</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:#d73a49">load_tasks</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ctx</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">TeaContext</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> payload</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token class-name">Json</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token class-name">TaskRequest</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">impl</span><span class="token plain"> </span><span class="token class-name">IntoResponse</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Here, ctx has already parsed X-User-Id, X-Trace-Id, and the client's IP!</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Directly proceed to core authorization and audit security base:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> tasks </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Q</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">tasks</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">execute_for_list</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">ctx</span><span class="token number" style="color:#36acaa">.0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword" style="color:#00009f">await</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">unwrap</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token class-name">WebResponse</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">of_list</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">tasks</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="feature-2-fully-compatible-webresponse">Feature 2: Fully Compatible WebResponse<a href="https://teaql.io/blog/teaql-ecosystem-web-and-redis-modules#feature-2-fully-compatible-webresponse" class="hash-link" aria-label="Direct link to Feature 2: Fully Compatible WebResponse" title="Direct link to Feature 2: Fully Compatible WebResponse">​</a></h3>
<p>During microservice evolution or frontend refactoring, API incompatibility is a major pain point. Our <code>WebResponse</code> struct has a built-in <code>IntoResponse</code> mapping mechanism for automatic status code resolution (including automatic intercepting of <code>AxumTeaError</code>). More importantly: <strong>its JSON serialization structure perfectly matches the previous Java Legacy API</strong>.</p>
<p>Whether it's a frontend application or an AI agent calling the endpoint via OpenAPI, no parser logic needs to be rewritten just because the backend transitioned to Rust.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="feature-3-native-support-for-facets-aggregated-categorization">Feature 3: Native Support for Facets (Aggregated Categorization)<a href="https://teaql.io/blog/teaql-ecosystem-web-and-redis-modules#feature-3-native-support-for-facets-aggregated-categorization" class="hash-link" aria-label="Direct link to Feature 3: Native Support for Facets (Aggregated Categorization)" title="Direct link to Feature 3: Native Support for Facets (Aggregated Categorization)">​</a></h3>
<p>In modern e-commerce, dashboards, or complex business queries, we often need to return not just a list of items but also grouped metadata (such as status counts or temporal distributions) for rendering sidebars. In the search domain, this is referred to as <strong>Facets</strong>.</p>
<p><code>teaql-web-integration-axum</code> provides first-class support for Facets. It accepts <code>SmartList</code> directly from the TeaQL Core engine (which comes with multi-dimensional facet data embedded) and formats it into the web response automatically:</p>
<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Get task list, with the engine calculating status-aggregated facets at the same time</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> smart_list </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Q</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">tasks</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">with_status_facets</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">execute_for_smart_list</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">ctx</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword" style="color:#00009f">await</span><span class="token operator" style="color:#393A34">?</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Convert it into a standard Web API response containing both data and facets with one line of code</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name">WebResponse</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">from_smart_list</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">smart_list</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>
<p>Once the frontend receives the JSON, the <code>data</code> array is used to render the main list, and the <code>facets</code> dictionary is immediately ready to populate the sidebar filter options.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="2-the-red-module-distributed-cache-with-a-single-line-of-code">2. The Red Module: Distributed Cache with a Single Line of Code<a href="https://teaql.io/blog/teaql-ecosystem-web-and-redis-modules#2-the-red-module-distributed-cache-with-a-single-line-of-code" class="hash-link" aria-label="Direct link to 2. The Red Module: Distributed Cache with a Single Line of Code" title="Direct link to 2. The Red Module: Distributed Cache with a Single Line of Code">​</a></h2>
<p>As concurrency increases, single-machine in-memory cache often reaches its limits. To address this, we launched the <strong><code>teaql-cache-integration-redis</code></strong> module.</p>
<p>The core philosophy of this module is: <strong>do not change any upper-level business code; simply replace the underlying provider to transition smoothly from single-machine to distributed caching</strong>.</p>
<p>It fully implements TeaQL's runtime <code>DataStore</code> trait. Developers and AI agents write the exact same, simple and unified syntax:</p>
<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Business code always uses this single syntax, independent of physical storage</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ctx</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">put</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"daily_task_stats"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> stats_value</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">Some</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">3600</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword" style="color:#00009f">await</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> stats </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> ctx</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"daily_task_stats"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword" style="color:#00009f">await</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p>At the initialization level, the architect only needs to inject the <code>RedisDataStore</code>:</p>
<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> redis_store </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">RedisDataStore</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">new</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"redis://127.0.0.1:6379/0"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword" style="color:#00009f">await</span><span class="token operator" style="color:#393A34">?</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> runtime </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">TeaRuntime</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">builder</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">with_data_store</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">redis_store</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// Instantly switch to distributed caching</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">build</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="summary-moving-toward-the-ultimate-agentic-state">Summary: Moving Toward the Ultimate Agentic State<a href="https://teaql.io/blog/teaql-ecosystem-web-and-redis-modules#summary-moving-toward-the-ultimate-agentic-state" class="hash-link" aria-label="Direct link to Summary: Moving Toward the Ultimate Agentic State" title="Direct link to Summary: Moving Toward the Ultimate Agentic State">​</a></h2>
<p>The introduction of these two new modules is far more than just adding a couple of adapters. Their essence lies in <strong>reducing the external entropy of the system</strong>:</p>
<ul>
<li>The <strong>Web module</strong> collapses raw, messy HTTP protocols into a structured <code>UserContext</code>.</li>
<li>The <strong>Red module</strong> abstracts complex Redis drivers into a unified <code>DataStore</code> interface.</li>
</ul>
<p>When an AI agent writes business code on top of TeaQL, it only faces one clean pathway: <strong>grab the Context, access data, and return a Response</strong>. No protocol bickering, no switching between different SDKs.</p>
<p>TeaQL digests all the low-level heavy lifting inside the framework kernel, allowing the future of software development to truly focus on business value.</p>]]></content:encoded>
            <category>ecosystem</category>
            <category>rust</category>
            <category>axum</category>
            <category>redis</category>
            <category>web</category>
        </item>
        <item>
            <title><![CDATA[Announcing Open Source: teaql-forge-rs — The Next-Generation TeaQL Semantic Generation Engine]]></title>
            <link>https://teaql.io/blog/teaql-forge-rs-open-source</link>
            <guid>https://teaql.io/blog/teaql-forge-rs-open-source</guid>
            <pubDate>Fri, 05 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[We are incredibly excited to announce that teaql-forge-rs is now officially open-source!]]></description>
            <content:encoded><![CDATA[<p>We are incredibly excited to announce that <strong><code>teaql-forge-rs</code> is now officially open-source!</strong></p>
<p>As an indispensable scaffolding and code generation engine in the entire TeaQL ecosystem, <code>teaql-forge-rs</code> carries the core mission of transforming human and AI high-level business intentions (<code>.tql</code> models) into production-ready executable code. Alongside the upgrade of the foundational <code>teaql-rs</code> and <code>teaql-code-gen</code> to v3.0, Forge has also welcomed its full open-source release.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-is-teaql-forge-rs">What is teaql-forge-rs?<a href="https://teaql.io/blog/teaql-forge-rs-open-source#what-is-teaql-forge-rs" class="hash-link" aria-label="Direct link to What is teaql-forge-rs?" title="Direct link to What is teaql-forge-rs?">​</a></h2>
<p>In the past, building an enterprise-level application that complies with Domain-Driven Design (DDD) standards, includes built-in auditing, and supports complex relational queries often required writing a massive amount of boilerplate code.</p>
<p><code>teaql-forge-rs</code> is a Rust-based code generation tool. By parsing the minimalist <code>.tql</code> DSL (Domain-Specific Language), it automatically generates your foundational <strong>domain models</strong>, <strong>type-safe Query APIs</strong>, <strong>database access layers (Repositories)</strong>, and even scaffolding interfaces for frontend-backend interaction. Forge helps alleviate the repetitive labor when writing Rust services.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="core-features">Core Features<a href="https://teaql.io/blog/teaql-forge-rs-open-source#core-features" class="hash-link" aria-label="Direct link to Core Features" title="Direct link to Core Features">​</a></h2>
<p>In this open-source release, <code>teaql-forge-rs</code> includes the following main features:</p>
<ol>
<li><strong>Lightweight Rust Generation Engine</strong>: A new, relatively streamlined Rust generation engine that supports automatic base code generation for CLI tools or Axum backend applications (Note: The closed-source commercial Java generation engine is not included here).</li>
<li><strong>Triple-Intent Semantic API Generation</strong>: Fully supports the latest <code>.comment()</code>, <code>.purpose()</code>, and <code>.audit_as()</code> semantic chain call specifications. The code generated by Forge natively forces developers and AI to provide clear business intentions when operating on data, turning logs from unreadable text into business stories.</li>
<li><strong>Lightning-Fast Parsing &amp; DDL Mapping</strong>: Leveraging Rust's extreme performance, it can parse complex architectures with hundreds of entity definitions in an instant, and automatically map them to DDL structures across multiple databases (PostgreSQL, MySQL, SQLite).</li>
<li><strong>Plug-and-Play DDD Structure</strong>: The generated code strictly adheres to Domain-Driven Design boundaries, perfectly decoupling the <code>Q::entities()</code> query interface from the persistence layer, drastically reducing maintenance costs and lowering the comprehension barrier for AI.</li>
</ol>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="docker-quick-start-guide">Docker Quick Start Guide<a href="https://teaql.io/blog/teaql-forge-rs-open-source#docker-quick-start-guide" class="hash-link" aria-label="Direct link to Docker Quick Start Guide" title="Direct link to Docker Quick Start Guide">​</a></h2>
<p>To allow everyone to experience <code>teaql-forge-rs</code> with zero environment configuration, we provide an official Docker image. You just need to write a <code>schema.tql</code>, and let Docker handle the rest.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="1-prepare-your-tql-model-file">1. Prepare Your TQL Model File<a href="https://teaql.io/blog/teaql-forge-rs-open-source#1-prepare-your-tql-model-file" class="hash-link" aria-label="Direct link to 1. Prepare Your TQL Model File" title="Direct link to 1. Prepare Your TQL Model File">​</a></h3>
<p>Create a <code>schema.tql</code> file in your current directory (for example, defining a simple task board):</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">entity Task {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    name: string</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    status: string</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="2-one-click-code-generation-via-docker">2. One-Click Code Generation via Docker<a href="https://teaql.io/blog/teaql-forge-rs-open-source#2-one-click-code-generation-via-docker" class="hash-link" aria-label="Direct link to 2. One-Click Code Generation via Docker" title="Direct link to 2. One-Click Code Generation via Docker">​</a></h3>
<p>By starting a local Docker service container and using the local client tool, you can experience one-click generation:</p>
<p><strong>1. Start the local code generation service:</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">docker run -d --name teaql-forge-server -p 8080:8080 teaql/teaql-forge-rs:latest</span><br></span></code></pre></div></div>
<p><strong>2. Seamlessly connect the client to the local service for generation:</strong></p>
<p>Combined with the <code>cargo-teaql</code> client tool we provided previously, you simply point the generation endpoint to your local service using <code>--endpoint-prefix</code> to output the enterprise scaffolding and domain:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">cargo-teaql gen-workspace --endpoint-prefix http://127.0.0.1:8080/ schema.tql --output ./generated-rust</span><br></span></code></pre></div></div>
<p>Once it finishes running, you'll see the complete set of enterprise-grade Rust code in the <code>generated-rust</code> folder in your current directory! This is fully compatible with all operations in <code>teaql-agent-kit</code>.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="daily-development-guide-after-generation">Daily Development Guide After Generation<a href="https://teaql.io/blog/teaql-forge-rs-open-source#daily-development-guide-after-generation" class="hash-link" aria-label="Direct link to Daily Development Guide After Generation" title="Direct link to Daily Development Guide After Generation">​</a></h2>
<p>After you generate code with <code>teaql-forge-rs</code>, your daily data operations will be completely oriented around domain objects, saying goodbye to tedious SQL string concatenation. Coupled with the latest "Triple-Intent" specification, the business intent of the code itself will be crystal clear.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="1-daily-data-queries-and-filtering">1. Daily Data Queries and Filtering<a href="https://teaql.io/blog/teaql-forge-rs-open-source#1-daily-data-queries-and-filtering" class="hash-link" aria-label="Direct link to 1. Daily Data Queries and Filtering" title="Direct link to 1. Daily Data Queries and Filtering">​</a></h3>
<p>All query operations are unified through the <code>Q::entities()</code> entry point. You can use method chaining as naturally as speaking, and you are forced to attach clear business comments:</p>
<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">generated_rust</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">::</span><span class="token class-name">Q</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> active_tasks </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Q</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">tasks</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">which_status_are</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"TODO"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">page</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">20</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">comment</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Retrieve board list data"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">purpose</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Display unfinished tasks"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">execute_for_list</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">ctx</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword" style="color:#00009f">await</span><span class="token operator" style="color:#393A34">?</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="2-business-workflows-in-ddd-mode">2. Business Workflows in DDD Mode<a href="https://teaql.io/blog/teaql-forge-rs-open-source#2-business-workflows-in-ddd-mode" class="hash-link" aria-label="Direct link to 2. Business Workflows in DDD Mode" title="Direct link to 2. Business Workflows in DDD Mode">​</a></h3>
<p>In Domain-Driven Design (DDD), we recommend completing business logic on in-memory domain objects before uniformly persisting them. You can first query the object, modify its state, and finally save it using <code>.audit_as()</code> carrying the audit context:</p>
<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// 1. Query the domain object</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> task </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Q</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">tasks</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">with_id_is</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">42</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">comment</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Get task by ID"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">purpose</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Prepare to advance task workflow status"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">execute_for_one</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">ctx</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword" style="color:#00009f">await</span><span class="token operator" style="color:#393A34">?</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">expect</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Task does not exist"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// 2. Pure in-memory state transition (via generated Setters or your own domain behaviors)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">task</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">update_status_to</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"DONE"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">update_name</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Completed task"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// 3. Persist with human operational intent</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">task</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">audit_as</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"User clicked the [Mark as Done] button"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">save</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">ctx</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword" style="color:#00009f">await</span><span class="token operator" style="color:#393A34">?</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p>In this mode, the underlying interceptor will not only execute the corresponding SQL but also automatically generate an audit log with immense business value: <code>[AUDIT] Task(42) UPDATED ... action: User clicked the [Mark as Done] button</code>.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="automating-programming-with-ai-assistants">Automating Programming with AI Assistants<a href="https://teaql.io/blog/teaql-forge-rs-open-source#automating-programming-with-ai-assistants" class="hash-link" aria-label="Direct link to Automating Programming with AI Assistants" title="Direct link to Automating Programming with AI Assistants">​</a></h2>
<p>A highly standardized, predictable underlying API surface is not only friendly to humans but also serves as "dessert" for large language models.</p>
<p>If you want AI to help you write business code with zero hallucinations, we strongly recommend using it in conjunction with <a href="https://github.com/teaql/teaql-agent-kit" target="_blank" rel="noopener noreferrer">teaql-agent-kit</a>. This toolkit contains built-in Prompts and playgrounds for AI tools like Cursor and GitHub Copilot.</p>
<p>With it, you only need to describe your requirement to the AI:</p>
<blockquote>
<p>"Find tasks where the name contains 'bug' and the status is 'TODO', and batch update their status to 'IN_PROGRESS'."</p>
</blockquote>
<p>The AI will be able to effortlessly and 100% accurately output the following code:</p>
<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> tasks </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Q</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">tasks</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">which_names_contain</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"bug"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">which_status_are</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"TODO"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">comment</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Retrieve historical Bugs"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">purpose</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Batch advance Bug status"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">execute_for_list</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">ctx</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword" style="color:#00009f">await</span><span class="token operator" style="color:#393A34">?</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> task </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> tasks </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    task</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">update_status_to</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"IN_PROGRESS"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    task</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">audit_as</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Automatically advance Bug processing progress"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">save</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">ctx</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword" style="color:#00009f">await</span><span class="token operator" style="color:#393A34">?</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>Through unified semantic API specifications, your AI assistant will truly evolve into a senior engineer that never makes mistakes.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="conclusion">Conclusion<a href="https://teaql.io/blog/teaql-forge-rs-open-source#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion">​</a></h2>
<p>In the era of Agentic Coding, we need a more predictable and semantic underlying API surface. The open-sourcing of <code>teaql-forge-rs</code> is a crucial step towards our vision of "Code is Business Intent".</p>
<p>Welcome to visit the GitHub repository to clone the code, open Issues, or submit PRs, and build the next-generation data runtime environment with us!</p>]]></content:encoded>
            <category>release</category>
            <category>open-source</category>
            <category>rust</category>
            <category>teaql-forge</category>
        </item>
        <item>
            <title><![CDATA[TeaQL Showcase: See What Your Business Code Actually Does]]></title>
            <link>https://teaql.io/blog/robot-task-board-showcase</link>
            <guid>https://teaql.io/blog/robot-task-board-showcase</guid>
            <pubDate>Sat, 30 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[A terminal-based Kanban board built with Ratatui and SQLite to demonstrate TeaQL in action.]]></description>
            <content:encoded><![CDATA[<p>Instead of hiding database behavior behind an opaque ORM, this demo shows the full execution path of a domain action:</p>
<p><code>Command</code> → <code>Domain transition</code> → <code>SQL</code> → <code>Audit diff</code> → <code>Event log</code> → <code>UI projection</code></p>
<p><img decoding="async" loading="lazy" alt="TeaQL task board demo" src="https://teaql.io/assets/images/003-task-board-5b481fd7af886a36f69c6ee148a788dd.png" width="2992" height="1636" class="img_ev3q"></p>
<p>The task board intentionally uses a tiny domain model so the runtime behavior is easy to follow. TeaQL itself is designed for significantly larger business domains, where understanding domain transitions, generated SQL, audit trails and query execution paths becomes even more important.</p>
<p>To make the idea concrete, we built a terminal-based Kanban board using Ratatui + SQLite. When you move a task from <em>Planned</em> to <em>Ready</em>, TeaQL shows the generated SQL, optimistic concurrency update, audit trail, lifecycle event, and refreshed status facets — all in real time.</p>
<p>The app also cross-compiles as a standalone statically linked binary for <code>armv7</code> router environments, with no external runtime dependencies.</p>
<p>✨ <strong>Powered by native <code>rusqlite</code></strong>: The TeaQL code generator natively supports <code>rusqlite</code>, producing 100% Rust-native SQLite execution code that compiles directly into your binary with zero external driver overhead.</p>
<p><strong>Try it instantly in two ways:</strong></p>
<ul>
<li><strong>Hosted SaaS demo:</strong> open the multi-tenant Robot Task Board at <a href="https://lab-robot-task-board-rust.teaql.io/" target="_blank" rel="noopener noreferrer">lab-robot-task-board-rust.teaql.io</a>. The hosted version is designed as a SaaS-style multi-tenant deployment, so different tenants can try the same TeaQL-powered task board without sharing one local database instance.</li>
<li><strong>Local Docker demo:</strong> run the server locally when you want to inspect the runtime behavior on your own machine.</li>
</ul>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">docker run --rm -it teaql/robot-task-board:minimal</span><br></span></code></pre></div></div>
<p>The demo app source is available at <a href="https://github.com/teaql/robot-task-board" target="_blank" rel="noopener noreferrer">teaql/robot-task-board</a>.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="teaql-for-rust">TeaQL for Rust<a href="https://teaql.io/blog/robot-task-board-showcase#teaql-for-rust" class="hash-link" aria-label="Direct link to TeaQL for Rust" title="Direct link to TeaQL for Rust">​</a></h2>
<p>TeaQL is coming to Rust.</p>
<p>We have now open-sourced the Rust-based TeaQL generator and runtime foundation. You can find the source code at <a href="https://github.com/teaql/teaql-forge-rs" target="_blank" rel="noopener noreferrer">teaql/teaql-forge-rs</a>.</p>
<p>For a faster hands-on experience, run the server directly with Docker:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">docker run -d --name teaql-forge-server -p 8080:8080 teaql/teaql-forge-rs:latest</span><br></span></code></pre></div></div>
<p>The project is still in its early stage. Our goal is to explore how TeaQL's domain query model can work naturally in Rust, and how it can help developers build domain-driven business applications with clearer models, safer queries, and better local tooling.</p>
<p>The early open-source line will focus on:</p>
<ul>
<li>a lightweight TeaQL generator for Rust</li>
<li>basic domain model definitions</li>
<li>query model and request structures</li>
<li>runtime foundation for local execution</li>
<li>simple examples and demo applications</li>
<li>a developer-friendly project structure for the Rust ecosystem</li>
</ul>
<p>This project is not intended to be a large framework from day one. We want to start small, make the basic ideas clear, and let developers understand how TeaQL can fit into Rust projects naturally. The early version will focus on clarity, simplicity, and practical usage.</p>
<p>Rust is a good fit for TeaQL's next step because it provides strong type safety, high performance, local-first deployment, single-binary distribution, good support for CLI and developer tools, and a growing ecosystem for business and infrastructure software.</p>
<p>TeaQL for Rust is an open-source Rust-based direction for TeaQL, starting with a lightweight generator and runtime foundation for building domain-driven business applications.</p>
<p>For this task board demo, the TeaQL runtime crates, generated Rust code, and Rust-focused generator foundation are open source. The source code is available at <a href="https://github.com/teaql/teaql-forge-rs" target="_blank" rel="noopener noreferrer">teaql/teaql-forge-rs</a>, and the Docker image above gives you the quickest way to try the server.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="-project-structure">📁 Project Structure<a href="https://teaql.io/blog/robot-task-board-showcase#-project-structure" class="hash-link" aria-label="Direct link to 📁 Project Structure" title="Direct link to 📁 Project Structure">​</a></h2>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">robot-task-board/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── src/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│   ├── app.rs           # Core Application State</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│   ├── commands.rs      # User command parsing (`/add`, `/mv`, etc)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│   ├── logging.rs       # TeaQL Audit Sink &amp; Logging extensions</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│   ├── main.rs          # Event loop &amp; application entry point</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│   ├── models.rs        # Lightweight models &amp; DTOs for the UI</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│   ├── service.rs       # Domain behavior, Aggregate Roots &amp; TeaQL queries</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│   ├── startup.rs       # Animated startup / bootstrap rendering</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│   ├── tui.rs           # Terminal initialization and restoration</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│   ├── ui.rs            # Ratatui layout, syntax-highlighted log rendering</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│   └── utils.rs         # System info (CPU/memory) from /proc</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── models/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│   └── model.xml        # Generated by AI via teaql-agent-kit (https://github.com/teaql/teaql-agent-kit), validated &amp; auto-healed via the `teaql eval` command</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── generate-lib/</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">│   └── lib/             # Auto-generated TeaQL domain library (Generated via `teaql gen-lib models/model.xml`)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">├── Cargo.toml</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">└── README.md</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="-why-teaql-10-applied-scenarios">🔬 Why TeaQL? (10 Applied Scenarios)<a href="https://teaql.io/blog/robot-task-board-showcase#-why-teaql-10-applied-scenarios" class="hash-link" aria-label="Direct link to 🔬 Why TeaQL? (10 Applied Scenarios)" title="Direct link to 🔬 Why TeaQL? (10 Applied Scenarios)">​</a></h2>
<p>This application exercises <strong>10 distinct TeaQL capabilities</strong> across its CRUD and query workflows. Each scenario below maps a TeaQL API to its concrete usage in this app and the exact SQL it produces.</p>
<hr>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="scenario-1-schema-bootstrap-ensure_rusqlite_schema_for">Scenario 1: Schema Bootstrap (<code>ensure_rusqlite_schema_for</code>)<a href="https://teaql.io/blog/robot-task-board-showcase#scenario-1-schema-bootstrap-ensure_rusqlite_schema_for" class="hash-link" aria-label="Direct link to scenario-1-schema-bootstrap-ensure_rusqlite_schema_for" title="Direct link to scenario-1-schema-bootstrap-ensure_rusqlite_schema_for">​</a></h3>
<p><strong>What it does:</strong> Automatically creates or migrates all database tables and seeds initial reference data (status values, platform) from the domain model — zero manual SQL.</p>
<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// service.rs — One-line schema setup</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> ctx </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">robot_kanban</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">::</span><span class="token function" style="color:#d73a49">module_with_behaviors_and_checkers</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">into_context</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ctx</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">use_rusqlite_provider</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">inner_executor</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">clone</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">ensure_rusqlite_schema_for</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">ctx</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">?</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p><strong>Applied in:</strong> <code>TaskService::new()</code> — on first run, creates <code>task_data</code>, <code>task_status_data</code>, and <code>platform_data</code> tables with seed data; on subsequent runs, applies any schema changes from the model.</p>
<blockquote>
<p><strong>Bonus (Sample Data):</strong> Beyond schema creation, the framework also auto-generates a <code>sample_data</code> module from your model. This allows developers to inject structured, type-safe mock entities with a single function call for rapid prototyping and unit testing, without writing a single raw <code>INSERT</code> statement:</p>
<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Scaffold a batch of dummy tasks and execution logs in one line</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token namespace" style="opacity:0.7">robot_kanban</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">::</span><span class="token function" style="color:#d73a49">generate_sample_data</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">ctx</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">SampleDataPlan</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">small</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword" style="color:#00009f">await</span><span class="token operator" style="color:#393A34">?</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
</blockquote>
<hr>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="scenario-2-json-based-dynamic-filtering-filter_with_json">Scenario 2: JSON-Based Dynamic Filtering (<code>filter_with_json</code>)<a href="https://teaql.io/blog/robot-task-board-showcase#scenario-2-json-based-dynamic-filtering-filter_with_json" class="hash-link" aria-label="Direct link to scenario-2-json-based-dynamic-filtering-filter_with_json" title="Direct link to scenario-2-json-based-dynamic-filtering-filter_with_json">​</a></h3>
<p><strong>What it does:</strong> Accepts a JSON object to dynamically construct WHERE clauses at runtime. An empty <code>{}</code> acts as a wildcard (no filter), enabling a single code path for both search and full-load.</p>
<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// service.rs — Unified search/load query</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> search_json </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> </span><span class="token class-name">Some</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">ref</span><span class="token plain"> term</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> search_term </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> escaped_name </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">serde_json</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">::</span><span class="token class-name">Value</span><span class="token punctuation" style="color:#393A34">::</span><span class="token class-name">String</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">term</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">clone</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token macro property" style="color:#36acaa">format!</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">r#"{{"name": {}}}"#</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> escaped_name</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">   </span><span class="token comment" style="color:#999988;font-style:italic">// → {"name": "calibrate"}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">else</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">r#"{}"#</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">to_owned</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">                            </span><span class="token comment" style="color:#999988;font-style:italic">// → {} (wildcard)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> select </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Q</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">tasks</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">filter_with_json</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">search_json</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<table><thead><tr><th style="text-align:left">Input</th><th style="text-align:left">JSON</th><th style="text-align:left">Generated SQL</th></tr></thead><tbody><tr><td style="text-align:left">No search</td><td style="text-align:left"><code>{}</code></td><td style="text-align:left"><code>SELECT ... FROM task_data WHERE (version &gt; 0)</code></td></tr><tr><td style="text-align:left"><code>calibrate</code></td><td style="text-align:left"><code>{"name": "calibrate"}</code></td><td style="text-align:left"><code>SELECT ... FROM task_data WHERE (version &gt; 0) AND (name LIKE '%calibrate%')</code></td></tr></tbody></table>
<p><strong>Applied in:</strong> <code>/search</code> or <code>/s</code> command — filters the Kanban board in real-time.</p>
<hr>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="scenario-3-faceted-aggregation-facet_by_status_as">Scenario 3: Faceted Aggregation (<code>facet_by_status_as</code>)<a href="https://teaql.io/blog/robot-task-board-showcase#scenario-3-faceted-aggregation-facet_by_status_as" class="hash-link" aria-label="Direct link to scenario-3-faceted-aggregation-facet_by_status_as" title="Direct link to scenario-3-faceted-aggregation-facet_by_status_as">​</a></h3>
<p><strong>What it does:</strong> Attaches a sub-query that computes aggregate counts grouped by a relation (status), all within a single database round-trip alongside the main entity query.</p>
<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// service.rs — Single query fetches tasks + status counts</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> select </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Q</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">tasks</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">comment</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">search_comment</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">filter_with_json</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">search_json</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">facet_by_status_as</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"status_stats"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// This sub-query could easily be extracted into a semantic helper method</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// e.g. `TaskStatusRequest::build_count_stats()` for reuse across the app</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name">Q</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">task_status</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">comment</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Count status"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">count_tasks</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> all_tasks </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> select</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">comment</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Query tasks"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">purpose</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Load data"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">execute_for_list</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token keyword" style="color:#00009f">self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ctx</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword" style="color:#00009f">await</span><span class="token operator" style="color:#393A34">?</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Access facet results from the same SmartList</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> </span><span class="token class-name">Some</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">facet_list</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> all_tasks</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">facet</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"status_stats"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> record </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> facet_list</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">iter</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> status_id </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> record</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"id"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> count </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> record</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"count_tasks"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<blockquote>
<p><strong>💡 Pro Tip (Semantic Encapsulation):</strong> Notice how <code>Q::task_status().count_tasks()</code> is passed directly. Because TeaQL queries are strongly-typed data structures, you can effortlessly extract these aggregations into reusable, semantic helper methods.</p>
<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// 1. Encapsulate the query logic into a reusable semantic method</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">impl</span><span class="token plain"> </span><span class="token class-name">TaskStatusRequest</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:#d73a49">build_count_stats</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-&gt;</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">Self</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name">Q</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">task_status</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">comment</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Count status"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">count_tasks</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// 2. Compose it cleanly in your main business logic</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> select </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Q</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">tasks</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">filter_with_json</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">search_json</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">facet_by_status_as</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"status_stats"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">TaskStatusRequest</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">build_count_stats</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p>This allows you to compose massive, multi-layered TeaQL queries dynamically without polluting your business logic. <em>(Note: The <code>E::</code> Expression API provides the exact same composability for field-level conditions and evaluations!)</em></p>
</blockquote>
<p><strong>Generated SQL (3 queries in one round-trip):</strong></p>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">-- 1. Main entity query</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">SELECT</span><span class="token plain"> id</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> name</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> version</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">status</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">AS</span><span class="token plain"> status_id</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> platform </span><span class="token keyword" style="color:#00009f">AS</span><span class="token plain"> platform_id</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">FROM</span><span class="token plain"> task_data </span><span class="token keyword" style="color:#00009f">WHERE</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">version </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">-- 2. Facet: load status reference data</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">SELECT</span><span class="token plain"> id</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> name</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> code</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> color</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> display_order</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> progress</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> version </span><span class="token keyword" style="color:#00009f">FROM</span><span class="token plain"> task_status_data </span><span class="token keyword" style="color:#00009f">WHERE</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">version </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">-- 3. Facet: aggregate task counts per status</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">SELECT</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">status</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">COUNT</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">*</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">AS</span><span class="token plain"> count_tasks</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">FROM</span><span class="token plain"> task_data </span><span class="token keyword" style="color:#00009f">WHERE</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">version </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">AND</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">version </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">AND</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">status</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">IN</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1001</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1002</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1003</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1004</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">GROUP</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">BY</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">status</span><br></span></code></pre></div></div>
<p><strong>Applied in:</strong> Board reload — the Planned/Process/Done count badges and task lists are all populated from this single query.</p>
<hr>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="scenario-4-entity-factory-qtaskscommentcreate-tasksnew_entity">Scenario 4: Entity Factory (<code>Q::tasks().comment("Create tasks").new_entity()</code>)<a href="https://teaql.io/blog/robot-task-board-showcase#scenario-4-entity-factory-qtaskscommentcreate-tasksnew_entity" class="hash-link" aria-label="Direct link to scenario-4-entity-factory-qtaskscommentcreate-tasksnew_entity" title="Direct link to scenario-4-entity-factory-qtaskscommentcreate-tasksnew_entity">​</a></h3>
<p><strong>What it does:</strong> Creates a new entity instance pre-wired with the runtime context, ready for field population and persistence.</p>
<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// task/logic.rs — Encapsulated factory method with DDD validation</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">impl</span><span class="token plain"> </span><span class="token class-name">Task</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:#d73a49">create</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">cmd</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token class-name">CreateTaskCommand</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> next_id</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">u64</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> ctx</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token class-name">UserContext</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-&gt;</span><span class="token plain"> </span><span class="token class-name">Result</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token keyword" style="color:#00009f">Self</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">AppError</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> task </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Q</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">tasks</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">comment</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Create tasks"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">new_entity</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ctx</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        task</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">update_id</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">next_id</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">update_name</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">cmd</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">name</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">clone</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">update_version</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1_i64</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">update_status_to_planned</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// Safe API: raw update_status_id(1) is blocked by the compiler</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">update_platform_id</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1_u64</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name">Ok</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">task</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p><strong>Generated SQL:</strong></p>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">INSERT</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">INTO</span><span class="token plain"> task_data </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">id</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> name</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> version</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">status</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> platform</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">VALUES</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'calibrate sensor'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre></div></div>
<p><strong>Applied in:</strong> bare input <code>&lt;name&gt;</code> or <code>/add</code> command — creates a new task in Planned status.</p>
<hr>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="scenario-5-id-space-generation-rusqliteidspacegenerator">Scenario 5: ID Space Generation (<code>RusqliteIdSpaceGenerator</code>)<a href="https://teaql.io/blog/robot-task-board-showcase#scenario-5-id-space-generation-rusqliteidspacegenerator" class="hash-link" aria-label="Direct link to scenario-5-id-space-generation-rusqliteidspacegenerator" title="Direct link to scenario-5-id-space-generation-rusqliteidspacegenerator">​</a></h3>
<p><strong>What it does:</strong> Generates globally unique, monotonically increasing IDs per entity type using a dedicated SQLite sequence table — no auto-increment column needed.</p>
<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// service.rs — add_task()</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> next_id </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ctx</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">next_id_for</span><span class="token punctuation" style="color:#393A34">::</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token class-name">Task</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">?</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p><strong>Applied in:</strong> bare input <code>&lt;name&gt;</code> or <code>/add</code> command — each new task receives a unique ID from the <code>Task</code> ID space.</p>
<blockquote>
<p><strong>💡 Pro Tip: The Universal <code>UserContext</code></strong>
Notice how we retrieve the ID generator from <code>self.ctx</code>? The <code>UserContext</code> object is pervasive throughout your application's domain layer and request lifecycle. Because it is visible everywhere, it acts as the perfect dependency injection container.</p>
<p>You can integrate any external resources directly into <code>UserContext</code>, such as:</p>
<ul>
<li>Redis caching layers</li>
<li>External API clients</li>
<li>Email / SMS service clients</li>
<li>Internationalization (i18n) resources</li>
</ul>
<p>Simply use <code>ctx.insert_resource(...)</code> at initialization, and use extension traits to expose type-safe, domain-specific methods anywhere in your business logic.</p>
</blockquote>
<hr>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="scenario-6-domain-behavior--cascading-save-ddd-aggregate-root">Scenario 6: Domain Behavior &amp; Cascading Save (DDD Aggregate Root)<a href="https://teaql.io/blog/robot-task-board-showcase#scenario-6-domain-behavior--cascading-save-ddd-aggregate-root" class="hash-link" aria-label="Direct link to Scenario 6: Domain Behavior &amp; Cascading Save (DDD Aggregate Root)" title="Direct link to Scenario 6: Domain Behavior &amp; Cascading Save (DDD Aggregate Root)">​</a></h3>
<p><strong>What it does:</strong> Allows attaching rich domain logic directly to generated entities using Rust's Native Extension Traits, and securely saving the entire Aggregate Root graph in a single atomic transaction.</p>
<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// service.rs — Executing a DDD behavior</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> task </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Q</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">tasks</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">comment</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Query tasks"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">purpose</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Load data"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">with_id_is</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">id</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">comment</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Query task_status"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">purpose</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Load data"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">execute_for_one</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token keyword" style="color:#00009f">self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ctx</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword" style="color:#00009f">await</span><span class="token operator" style="color:#393A34">?</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// 1. Invoke pure domain method (updates internal state)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> next_status </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> task</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">transition_status</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">cmd</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">?</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// 2. Generate a child log entity via domain behavior</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> log </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> task</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">generate_execution_log</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"STATUS_CHANGED"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">detail</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token keyword" style="color:#00009f">self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ctx</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// 3. Attach the child to the Aggregate Root's collection</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">task</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">task_execution_log_list_mut</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">push</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">log</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">task</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">set_comment</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Move task status"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// 4. Graph persistence: Recursively saves the Task AND inserts the new child Log!</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">task</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">save</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token keyword" style="color:#00009f">self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ctx</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword" style="color:#00009f">await</span><span class="token operator" style="color:#393A34">?</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p><strong>Applied in:</strong> <code>/mv</code> command — enabling clean, expressive state mutations directly on <code>Task</code> objects.</p>
<hr>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="scenario-7-partial-projections--aggregations-return_typet">Scenario 7: Partial Projections &amp; Aggregations (<code>return_type::&lt;T&gt;()</code>)<a href="https://teaql.io/blog/robot-task-board-showcase#scenario-7-partial-projections--aggregations-return_typet" class="hash-link" aria-label="Direct link to scenario-7-partial-projections--aggregations-return_typet" title="Direct link to scenario-7-partial-projections--aggregations-return_typet">​</a></h3>
<p><strong>What it does:</strong> Tells TeaQL to deserialize query results into a custom data transfer object (DTO) instead of the default generated entity. This is vital when executing partial selects or complex groupings where the returned shape no longer matches the full entity.</p>
<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Define a custom DTO for aggregations or partial fields</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token attribute attr-name" style="color:#00a4db">#[derive(TeaqlEntity)]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token type-definition class-name">StatusStats</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> status</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">i32</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> task_count</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">i64</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Fetch custom projection instead of raw Task</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> stats </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Q</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">tasks</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">select_status</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">count_id_as</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"task_count"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">group_by_status</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">return_type</span><span class="token punctuation" style="color:#393A34">::</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token class-name">StatusStats</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">comment</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Query tasks"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">purpose</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Load data"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">execute_for_list</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">ctx</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword" style="color:#00009f">await</span><span class="token operator" style="color:#393A34">?</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p><strong>Applied in:</strong> High-performance dashboard rendering — avoids full-entity deserialization overhead when projecting lightweight summaries or grouped counts.</p>
<hr>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="scenario-8-audited-soft-delete-mark_as_delete">Scenario 8: Audited Soft-Delete (mark_as_delete)<a href="https://teaql.io/blog/robot-task-board-showcase#scenario-8-audited-soft-delete-mark_as_delete" class="hash-link" aria-label="Direct link to Scenario 8: Audited Soft-Delete (mark_as_delete)" title="Direct link to Scenario 8: Audited Soft-Delete (mark_as_delete)">​</a></h3>
<p><strong>What it does:</strong> Deletes an entity using the rich domain object rather than raw IDs. By chaining <code>mark_as_delete()</code> and <code>set_comment()</code> directly on the entity, TeaQL enforces optimistic concurrency (via the entity's current <code>version</code>) and gracefully propagates the deletion context to the <code>EntityEventSink</code> for audit logging.</p>
<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// service.rs — delete_task()</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> task_name </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> task</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">name</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">to_string</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">task</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">mark_as_delete</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">set_comment</span><span class="token punctuation" style="color:#393A34">(</span><span class="token macro property" style="color:#36acaa">format!</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Delete task '{}'"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> task_name</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">task</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">save</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token keyword" style="color:#00009f">self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ctx</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword" style="color:#00009f">await</span><span class="token operator" style="color:#393A34">?</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p><strong>Generated SQL:</strong></p>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">UPDATE</span><span class="token plain"> task_data </span><span class="token keyword" style="color:#00009f">SET</span><span class="token plain"> version </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">2</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">WHERE</span><span class="token plain"> id </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">AND</span><span class="token plain"> version </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><br></span></code></pre></div></div>
<p>TeaQL uses a soft-delete pattern — <code>version</code> is set to a negative value rather than removing the row, preserving audit history.</p>
<p><strong>Applied in:</strong> <code>/del</code> command.</p>
<hr>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="scenario-9-comment-chain-propagation-comment">Scenario 9: Comment Chain Propagation (<code>.comment()</code>)<a href="https://teaql.io/blog/robot-task-board-showcase#scenario-9-comment-chain-propagation-comment" class="hash-link" aria-label="Direct link to scenario-9-comment-chain-propagation-comment" title="Direct link to scenario-9-comment-chain-propagation-comment">​</a></h3>
<p><strong>What it does:</strong> Attaches human-readable intent annotations to queries. When queries have nested sub-queries (e.g., facets), comments propagate down the chain with <code>-&gt;</code> separators, creating a full trace of query intent.</p>
<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// service.rs — Comments propagate through facet sub-queries</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> select </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Q</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">tasks</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">comment</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Get active tasks"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">                       </span><span class="token comment" style="color:#999988;font-style:italic">// Parent comment</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">filter_with_json</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">search_json</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">facet_by_status_as</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"status_stats"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name">Q</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">task_status</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">comment</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Count status"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">       </span><span class="token comment" style="color:#999988;font-style:italic">// Child comment</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">count_tasks</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p><strong>Resulting log trace chain:</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">[Get active tasks]                                → main task query</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[Get active tasks-&gt;status_stats-&gt;Count status]    → facet status lookup</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[Get active tasks-&gt;status_stats-&gt;Count status]    → facet aggregate count</span><br></span></code></pre></div></div>
<p>The TUI renders these traces in real-time with syntax-highlighted colors — timestamp, user context (<code>[philip]</code>), comment chains, result summaries, and elapsed times are each distinctly colored:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">[12:06:00.225]-[philip]-[0.184ms]-[DEBUG]-SqlLogEntry - [Get active tasks] - [5*Task] SELECT ... </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[12:06:00.226]-[philip]-[0.138ms]-[DEBUG]-SqlLogEntry - [Get active tasks-&gt;status_stats-&gt;Count status] - [3*TaskStatus] SELECT ... </span><br></span></code></pre></div></div>
<p><strong>Applied in:</strong> Every query in the application — enables real-time SQL auditing from the TUI log panel.</p>
<hr>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="scenario-10-entity-audit-subsystem-entityeventsink">Scenario 10: Entity Audit Subsystem (<code>EntityEventSink</code>)<a href="https://teaql.io/blog/robot-task-board-showcase#scenario-10-entity-audit-subsystem-entityeventsink" class="hash-link" aria-label="Direct link to scenario-10-entity-audit-subsystem-entityeventsink" title="Direct link to scenario-10-entity-audit-subsystem-entityeventsink">​</a></h3>
<p><strong>What it does:</strong> TeaQL automatically hooks into the persistence lifecycle to track fine-grained Entity Events (Create, Update, Delete, Recover) and computes precise field-level diffs (<code>old_value</code> ➔ <code>new_value</code>).</p>
<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// logging.rs — Implement the sink to intercept framework audit events</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token type-definition class-name">AppAuditSink</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">impl</span><span class="token plain"> </span><span class="token class-name">EntityEventSink</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> </span><span class="token class-name">AppAuditSink</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:#d73a49">on_event</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token keyword" style="color:#00009f">self</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> ctx</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token class-name">UserContext</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> event</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token class-name">EntityEvent</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-&gt;</span><span class="token plain"> </span><span class="token class-name">Result</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">RuntimeError</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> user </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">short_user</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ctx</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// ... format changes and output to TUI Log Area and app.log</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> change </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">event</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">changes </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> detail_line </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token macro property" style="color:#36acaa">format!</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token string" style="color:#e3116c">"[{}]-[{}]-[AUDIT]-  -&gt; Field [{}]: {} ➔ {}"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                timestamp</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> user</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> change</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">field</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> change</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">old_value</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> change</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">new_value</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name">Ok</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Attach it during runtime initialization</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ctx</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">set_event_sink</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">AppAuditSink</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p><strong>Resulting log output:</strong></p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">[12:04:23.529]-[philip]-[AUDIT]-Entity [Task(1)] was UPDATED. [Move task 'My New Task' status from PLANNED to READY]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[12:04:23.529]-[philip]-[AUDIT]-  -&gt; Field [status]: PLANNED ➔ READY</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[12:04:23.529]-[philip]-[AUDIT]-  -&gt; Field [version]: 1 ➔ 2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[12:04:23.530]-[philip]-[AUDIT]-Entity [TaskExecutionLog(2)] was CREATED. [Move task 'My New Task' status from PLANNED to READY]</span><br></span></code></pre></div></div>
<p><img decoding="async" loading="lazy" alt="TeaQL audit trail demo" src="https://teaql.io/assets/images/004-audit-trial-0c091ba71609c509fca7bc71fa4f7ce3.png" width="2590" height="592" class="img_ev3q"></p>
<p><strong>Next Steps / Coming Soon:</strong>
In the next phase, we will introduce the <strong><code>audit ignore</code></strong> feature. By adding an attribute in the <code>model.xml</code>, developers will be able to explicitly exclude sensitive data (like passwords, PII, or internal tokens) from being captured or diffed by the audit subsystem.</p>
<hr>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="scenario-summary">Scenario Summary<a href="https://teaql.io/blog/robot-task-board-showcase#scenario-summary" class="hash-link" aria-label="Direct link to Scenario Summary" title="Direct link to Scenario Summary">​</a></h3>
<table><thead><tr><th style="text-align:left">#</th><th style="text-align:left">TeaQL API</th><th style="text-align:left">App Feature</th><th style="text-align:left">Command</th></tr></thead><tbody><tr><td style="text-align:left">1</td><td style="text-align:left"><code>ensure_rusqlite_schema_for</code></td><td style="text-align:left">Auto-create tables &amp; seed data</td><td style="text-align:left">Startup</td></tr><tr><td style="text-align:left">2</td><td style="text-align:left"><code>filter_with_json</code></td><td style="text-align:left">Dynamic search / wildcard load</td><td style="text-align:left"><code>/s</code></td></tr><tr><td style="text-align:left">3</td><td style="text-align:left"><code>facet_by_status_as</code></td><td style="text-align:left">Status count aggregation</td><td style="text-align:left">Board reload</td></tr><tr><td style="text-align:left">4</td><td style="text-align:left"><code>Q::tasks().comment("Create tasks").new_entity()</code></td><td style="text-align:left">Create task with defaults</td><td style="text-align:left"><code>&lt;name&gt;</code></td></tr><tr><td style="text-align:left">5</td><td style="text-align:left"><code>RusqliteIdSpaceGenerator</code></td><td style="text-align:left">Unique ID generation</td><td style="text-align:left"><code>&lt;name&gt;</code></td></tr><tr><td style="text-align:left">6</td><td style="text-align:left"><code>Extension Traits</code></td><td style="text-align:left">Domain Behavior Injection (DDD)</td><td style="text-align:left"><code>/mv</code>, <code>/del</code></td></tr><tr><td style="text-align:left">7</td><td style="text-align:left"><code>.return_type::&lt;T&gt;()</code></td><td style="text-align:left">Custom partial projection &amp; stats DTOs</td><td style="text-align:left">Optimization</td></tr><tr><td style="text-align:left">8</td><td style="text-align:left"><code>EntityStatus::UpdatedDeleted</code></td><td style="text-align:left">Audited soft-delete with concurrency</td><td style="text-align:left"><code>/del</code></td></tr><tr><td style="text-align:left">9</td><td style="text-align:left"><code>.comment()</code></td><td style="text-align:left">Query intent tracing</td><td style="text-align:left">All queries</td></tr><tr><td style="text-align:left">10</td><td style="text-align:left"><code>EntityEventSink</code></td><td style="text-align:left">Field-level lifecycle diffs &amp; Audit</td><td style="text-align:left">All mutations</td></tr></tbody></table>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="-architecture">📐 Architecture<a href="https://teaql.io/blog/robot-task-board-showcase#-architecture" class="hash-link" aria-label="Direct link to 📐 Architecture" title="Direct link to 📐 Architecture">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="3-layer-separation">3-Layer Separation<a href="https://teaql.io/blog/robot-task-board-showcase#3-layer-separation" class="hash-link" aria-label="Direct link to 3-Layer Separation" title="Direct link to 3-Layer Separation">​</a></h3>
<table><thead><tr><th style="text-align:left">Layer</th><th style="text-align:left">File</th><th style="text-align:left">Responsibility</th></tr></thead><tbody><tr><td style="text-align:left"><strong>UI / Presentation</strong></td><td style="text-align:left"><code>ui.rs</code>, <code>startup.rs</code>, <code>tui.rs</code></td><td style="text-align:left">Ratatui layout, startup animation, log syntax highlighting, terminal management</td></tr><tr><td style="text-align:left"><strong>Application Layer</strong></td><td style="text-align:left"><code>main.rs</code>, <code>app.rs</code>, <code>commands.rs</code></td><td style="text-align:left">App state, command parsing, event loop orchestration</td></tr><tr><td style="text-align:left"><strong>Service &amp; Domain</strong></td><td style="text-align:left"><code>service.rs</code>, <code>logging.rs</code>, <code>models.rs</code></td><td style="text-align:left">TeaQL queries, DDD aggregate roots, audit sinks, view models</td></tr></tbody></table>
<p><code>main.rs</code> has no direct dependency on TeaQL types — it only interacts with <code>TaskService</code>, <code>TaskModel</code>, and <code>MoveResult</code>.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="ddd-aggregate-root">DDD Aggregate Root<a href="https://teaql.io/blog/robot-task-board-showcase#ddd-aggregate-root" class="hash-link" aria-label="Direct link to DDD Aggregate Root" title="Direct link to DDD Aggregate Root">​</a></h3>
<p>Generated <code>Task</code> entities act as Data Transfer Objects but are extended with native <code>impl Task</code> methods to encapsulate business logic:</p>
<ul>
<li><strong><code>Task::create()</code></strong> — factory method with validation</li>
<li><strong><code>Task::transition_status()</code></strong> — automatic next-status resolution</li>
<li><strong><code>Task::generate_execution_log()</code></strong> — encapsulation of internal event generation</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="domain-model">Domain Model<a href="https://teaql.io/blog/robot-task-board-showcase#domain-model" class="hash-link" aria-label="Direct link to Domain Model" title="Direct link to Domain Model">​</a></h3>
<p>Defined in <code>models/model.xml</code>, the TeaQL domain model declares two entities with a status relation:</p>
<div class="language-xml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-xml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">task_status</span><span class="token tag" style="color:#00009f"></span><br></span><span class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">    </span><span class="token tag attr-name" style="color:#00a4db">name</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">Planned|Ready|Executing|Verified</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"></span><br></span><span class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">    </span><span class="token tag attr-name" style="color:#00a4db">code</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">PLANNED|READY|EXECUTING|VERIFIED</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"></span><br></span><span class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">    </span><span class="token tag attr-name" style="color:#00a4db">_features</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">status</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"></span><br></span><span class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">    </span><span class="token tag attr-name" style="color:#00a4db">_identified_by</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">code</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag" style="color:#00009f">task</span><span class="token tag" style="color:#00009f"></span><br></span><span class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">    </span><span class="token tag attr-name" style="color:#00a4db">name</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">Task Name|[1,200]</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"></span><br></span><span class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">    </span><span class="token tag attr-name" style="color:#00a4db">status</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">task_status()</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"></span><br></span><span class="token-line" style="color:#393A34"><span class="token tag" style="color:#00009f">    </span><span class="token tag attr-name" style="color:#00a4db">_features</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag attr-value" style="color:#e3116c">custom</span><span class="token tag attr-value punctuation" style="color:#393A34">"</span><span class="token tag" style="color:#00009f"> </span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="-taming-ai-via-service-generated-apis">🤖 Taming AI via Service-Generated APIs<a href="https://teaql.io/blog/robot-task-board-showcase#-taming-ai-via-service-generated-apis" class="hash-link" aria-label="Direct link to 🤖 Taming AI via Service-Generated APIs" title="Direct link to 🤖 Taming AI via Service-Generated APIs">​</a></h3>
<p>A hidden paradigm shift in this architecture is how naturally it tames AI coding assistants. The workflow forms a highly predictable closed loop:</p>
<ol>
<li><strong>AI Generation:</strong> An AI easily drafts the declarative domain model (<code>model.xml</code>) from raw business requirements. To automate this process entirely, we built the <a href="https://github.com/teaql/teaql-agent-kit" target="_blank" rel="noopener noreferrer">teaql-agent-kit</a>.</li>
<li><strong>Translation Service:</strong> A dedicated background service takes this model and translates it into a dense, strictly-typed Rust API layer.</li>
<li><strong>High-Obedience Implementation:</strong> When the AI helps you write application logic, it relies entirely on these generated, compiler-enforced APIs.</li>
</ol>
<p>This generated layer acts as an absolute guardrail against common AI hallucinations:</p>
<ul>
<li><strong>Safe Setters (No Magic Numbers):</strong> Instead of <code>task.update_status_id(1)</code> (which is natively blocked by the compiler), the AI is forced to use the semantic <code>task.update_status_to_planned()</code>. It cannot hallucinate invalid foreign keys.</li>
<li><strong>Safe Getters (The <code>E::</code> Expression API):</strong> Deeply nested or nullable data retrieval in Rust often causes AI to write buggy <code>.unwrap()</code> chains. TeaQL provides a monadic expression API:<!-- -->
<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">robot_kanban</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">::</span><span class="token class-name">E</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// Safe optional-chaining: swallows nulls gracefully and eliminates type mismatch</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> name </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">E</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">task_status</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">status</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">get_name</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">eval</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">unwrap_or</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">raw_str</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<!-- -->The AI gets perfect auto-completion for legitimate fields (<code>.get_name()</code>) and produces zero runtime panics.</li>
</ul>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="-commands">🛠 Commands<a href="https://teaql.io/blog/robot-task-board-showcase#-commands" class="hash-link" aria-label="Direct link to 🛠 Commands" title="Direct link to 🛠 Commands">​</a></h2>
<p>Commands use a slash (<code>/</code>) prefix. <strong>Any bare text (without a slash) is treated as a quick-add for a new task.</strong></p>
<table><thead><tr><th style="text-align:left">Command</th><th style="text-align:left">Shortcut</th><th style="text-align:left">Description</th><th style="text-align:left">Example</th></tr></thead><tbody><tr><td style="text-align:left"><code>&lt;name&gt;</code> / <code>/add &lt;name&gt;</code></td><td style="text-align:left">—</td><td style="text-align:left">Create a new task in Planned status</td><td style="text-align:left"><code>calibrate sensor</code> or <code>/add calibrate</code></td></tr><tr><td style="text-align:left"><code>/move &lt;id&gt; [status]</code></td><td style="text-align:left"><code>/mv</code></td><td style="text-align:left">Transition task status (planned/ready/executing/verified; default: next)</td><td style="text-align:left"><code>/move 3</code> or <code>/mv 3 ready</code></td></tr><tr><td style="text-align:left"><code>/search &lt;keyword&gt;</code></td><td style="text-align:left"><code>/s</code></td><td style="text-align:left">Filter tasks by keyword (empty to clear)</td><td style="text-align:left"><code>/search calibrate</code> or <code>/s</code></td></tr><tr><td style="text-align:left"><code>/delete &lt;id&gt;</code></td><td style="text-align:left"><code>/del</code></td><td style="text-align:left">Permanently delete a task</td><td style="text-align:left"><code>/delete 3</code></td></tr><tr><td style="text-align:left"><code>/exit</code> / <code>/quit</code></td><td style="text-align:left"><code>/q</code></td><td style="text-align:left">Quit the application</td><td style="text-align:left"><code>/exit</code></td></tr><tr><td style="text-align:left">—</td><td style="text-align:left"><code>ESC</code></td><td style="text-align:left">Immediate exit</td><td style="text-align:left">—</td></tr><tr><td style="text-align:left">—</td><td style="text-align:left"><code>Up/Dn</code></td><td style="text-align:left">Scroll Action Logs viewport</td><td style="text-align:left">—</td></tr></tbody></table>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="️-prerequisites">⚙️ Prerequisites<a href="https://teaql.io/blog/robot-task-board-showcase#%EF%B8%8F-prerequisites" class="hash-link" aria-label="Direct link to ⚙️ Prerequisites" title="Direct link to ⚙️ Prerequisites">​</a></h2>
<ul>
<li><strong>Rust toolchain</strong> (1.70+)</li>
<li><strong>TeaQL Runtime Packages</strong> — the following crates are expected to be available (e.g., via relative path or git submodule):<!-- -->
<ul>
<li><code>teaql-core</code>, <code>teaql-runtime</code>, <code>teaql-macros</code>, <code>teaql-sql</code>, <code>teaql-provider-rusqlite</code></li>
</ul>
</li>
</ul>
<blockquote>
<p><strong>A Note on Open Source:</strong> The TeaQL Rust generator and runtime foundation are now open source at <a href="https://github.com/teaql/teaql-forge-rs" target="_blank" rel="noopener noreferrer">teaql/teaql-forge-rs</a>. For a faster experience, you can also run <code>docker run -d --name teaql-forge-server -p 8080:8080 teaql/teaql-forge-rs:latest</code> and try the server directly.</p>
</blockquote>
<ul>
<li><strong>For cross-compilation</strong>: <code>cargo-zigbuild</code> and the <code>armv7-unknown-linux-musleabihf</code> target</li>
</ul>
<blockquote>
<p><strong>Note:</strong> TeaQL runtime crates are published on <a href="https://crates.io/crates/teaql-core" target="_blank" rel="noopener noreferrer">crates.io</a>. No local checkout is needed — <code>cargo build</code> will fetch them automatically.</p>
</blockquote>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="-build--run">🚀 Build &amp; Run<a href="https://teaql.io/blog/robot-task-board-showcase#-build--run" class="hash-link" aria-label="Direct link to 🚀 Build &amp; Run" title="Direct link to 🚀 Build &amp; Run">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="local-development">Local Development<a href="https://teaql.io/blog/robot-task-board-showcase#local-development" class="hash-link" aria-label="Direct link to Local Development" title="Direct link to Local Development">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># Check compilation</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">cargo check</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Run the TUI</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">cargo run</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Run the TUI in compact mode (hides the SQL log area)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">cargo run -- -c</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># Build optimized release binary</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">cargo build --release</span><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="armv7-cross-compilation">ARMv7 Cross-Compilation<a href="https://teaql.io/blog/robot-task-board-showcase#armv7-cross-compilation" class="hash-link" aria-label="Direct link to ARMv7 Cross-Compilation" title="Direct link to ARMv7 Cross-Compilation">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"># Static cross-compile for armv7 routers</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">cargo zigbuild --release --target armv7-unknown-linux-musleabihf</span><br></span></code></pre></div></div>
<p>The output binary is at <code>target/armv7-unknown-linux-musleabihf/release/robot-task-board</code> — upload directly to a router and run with zero dependencies.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="running-tests">Running Tests<a href="https://teaql.io/blog/robot-task-board-showcase#running-tests" class="hash-link" aria-label="Direct link to Running Tests" title="Direct link to Running Tests">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">cargo test</span><br></span></code></pre></div></div>
<p>Tests cover:</p>
<ul>
<li><strong>Comment propagation</strong> — verifies TeaQL comment chains propagate through facet sub-queries</li>
<li><strong>CRUD lifecycle</strong> — add → reload → verify → delete → verify</li>
<li><strong>DDD transitions</strong> — Planned → Ready → Executing → Verified with automatic and explicit status moves</li>
</ul>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="-what-wed-love-feedback-on">💬 What We'd Love Feedback On<a href="https://teaql.io/blog/robot-task-board-showcase#-what-wed-love-feedback-on" class="hash-link" aria-label="Direct link to 💬 What We'd Love Feedback On" title="Direct link to 💬 What We'd Love Feedback On">​</a></h2>
<p>We're building TeaQL because we believe developers shouldn't have to choose between clean Domain-Driven Design and raw SQL performance/visibility.</p>
<p>If you try out this Kanban board or look at the code:</p>
<ul>
<li><strong>Does the query tracing (<code>.comment()</code>) actually help you understand what the app is doing?</strong></li>
<li><strong>How do you feel about defining your domain in <code>model.xml</code> vs writing Rust structs directly?</strong> We'd love your thoughts on the DX of declarative modeling.</li>
<li><strong>Upcoming Feature:</strong> We are working on an <code>audit ignore</code> attribute to exclude PII/sensitive data from the <code>EntityEventSink</code>. How do you currently handle this in your stack?</li>
</ul>
<p>Drop a comment on HN, open an issue, or reach out!</p>
<p><em>(P.S. TeaQL was originally born out of our need to manage complex workflows and data at scale. Check out the framework behind this at <a href="https://teaql.io/" target="_blank" rel="noopener noreferrer">teaql.io</a> — if you're building physical infra or complex business logic, come say hi!)</em></p>]]></content:encoded>
            <category>teaql</category>
            <category>showcase</category>
            <category>rust</category>
            <category>ratatui</category>
            <category>sqlite</category>
        </item>
        <item>
            <title><![CDATA[TeaQL 1.0.0 Release Notes]]></title>
            <link>https://teaql.io/blog/teaql-1-0-0-release</link>
            <guid>https://teaql.io/blog/teaql-1-0-0-release</guid>
            <pubDate>Sat, 30 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[TeaQL 1.0.0 brings zero-repo chained mutations, fixed graph ID generation topology, and AI-native coding workflows.]]></description>
            <content:encoded><![CDATA[<p>We are thrilled to announce the release of <strong>TeaQL 1.0.0</strong>! This milestone marks the stabilization of our core APIs, major performance improvements, and a completely redefined model-driven development experience across both Rust and Java (Spring Boot) ecosystems.</p>
<p>TeaQL 1.0.0 focuses on <strong>API Elegance, Developer Ergonomics, AI-Native Workflows, and Transaction Safety</strong>.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="-major-highlights">🌟 Major Highlights<a href="https://teaql.io/blog/teaql-1-0-0-release#-major-highlights" class="hash-link" aria-label="Direct link to 🌟 Major Highlights" title="Direct link to 🌟 Major Highlights">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="1-ultra-elegant-native-chained-mutations-zero-repo">1. Ultra-Elegant Native Chained Mutations (Zero-Repo)<a href="https://teaql.io/blog/teaql-1-0-0-release#1-ultra-elegant-native-chained-mutations-zero-repo" class="hash-link" aria-label="Direct link to 1. Ultra-Elegant Native Chained Mutations (Zero-Repo)" title="Direct link to 1. Ultra-Elegant Native Chained Mutations (Zero-Repo)">​</a></h3>
<p>We have completely phased out raw repository-level guard classes (e.g., <code>QueryCommentGuard</code>). Operations on entities are now performed entirely via pure, fluent, object-oriented method chaining on the generated entities themselves.</p>
<ul>
<li><strong>Before:</strong> Manual context building, repository lookups, and passing guards.</li>
<li><strong>After (Rust/Java):</strong>
<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Beautiful, domain-driven API</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">task</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">update_status_to_planned</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">set_comment</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Start working on feature X"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">audit_as</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Save operation"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">save</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">ctx</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword" style="color:#00009f">await</span><span class="token operator" style="color:#393A34">?</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
</li>
</ul>
<p>All persistence and graph relationship merging happens automatically under the hood via the newly stabilized <code>entity.audit_as("Save operation").save(&amp;ctx)</code> method.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="2-complete-transaction--topological-safety">2. Complete Transaction &amp; Topological Safety<a href="https://teaql.io/blog/teaql-1-0-0-release#2-complete-transaction--topological-safety" class="hash-link" aria-label="Direct link to 2. Complete Transaction &amp; Topological Safety" title="Direct link to 2. Complete Transaction &amp; Topological Safety">​</a></h3>
<ul>
<li><strong>Postgres ID Generation Race Fixed</strong>: The core graph engine now correctly analyzes dependency topology. Entities are inserted in the exact required order (e.g., <code>Product</code> before <code>OrderLine</code>), ensuring foreign-key relationships are established perfectly and IDs are generated without race conditions.</li>
<li><strong>Java <code>@Transactional</code> Integration</strong>: Large operations like sample data generation are now wrapped in a single, unified transaction context. This provides a massive performance boost (thousands of inserts in milliseconds) and ensures atomic rollbacks.</li>
<li><strong>Rust <code>QueryExecutor</code> Stability</strong>: Deep integration with SQLx ensures that <code>entity.audit_as("Save operation").save(&amp;ctx)</code> intelligently triggers <code>begin_transaction</code> and <code>commit_transaction</code>, handling complex graph-writes as a single atomic unit.</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="3-api-naming-convention-modernization-which_-️-with_">3. API Naming Convention Modernization (<code>which_</code> ➡️ <code>with_</code>)<a href="https://teaql.io/blog/teaql-1-0-0-release#3-api-naming-convention-modernization-which_-%EF%B8%8F-with_" class="hash-link" aria-label="Direct link to 3-api-naming-convention-modernization-which_-️-with_" title="Direct link to 3-api-naming-convention-modernization-which_-️-with_">​</a></h3>
<p>To improve semantic clarity and readability, all query filtering methods have been renamed from <code>which_*</code> to <code>with_*</code>.</p>
<ul>
<li><code>which_name_contains</code> -&gt; <code>with_name_contains</code></li>
<li><code>which_status_is</code> -&gt; <code>with_status_is</code></li>
</ul>
<p>This change makes complex queries read exactly like natural language.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="4-ai-first-architecture-agentsmd">4. AI-First Architecture (<code>AGENTS.md</code>)<a href="https://teaql.io/blog/teaql-1-0-0-release#4-ai-first-architecture-agentsmd" class="hash-link" aria-label="Direct link to 4-ai-first-architecture-agentsmd" title="Direct link to 4-ai-first-architecture-agentsmd">​</a></h3>
<p>TeaQL 1.0.0 is the first framework built with AI-Coding agents in mind. Our code generators now emit an <code>AGENTS.md</code> file designed to directly instruct LLMs (like Cursor, GitHub Copilot, and Claude) on your project's data architecture, constraints, and Red Lines (e.g., mandatory audit logging requirements via <code>.set_comment()</code>).</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="-bug-fixes--core-improvements">🐞 Bug Fixes &amp; Core Improvements<a href="https://teaql.io/blog/teaql-1-0-0-release#-bug-fixes--core-improvements" class="hash-link" aria-label="Direct link to 🐞 Bug Fixes &amp; Core Improvements" title="Direct link to 🐞 Bug Fixes &amp; Core Improvements">​</a></h2>
<ul>
<li><strong>Macro Stability:</strong> Cleaned up outdated <code>attach_root_recursive</code> generation logic in <code>teaql-macros</code>.</li>
<li><strong>Date/Timestamp Parsing:</strong> Fixed edge-case bugs in Text-to-Date and Timestamp conversions.</li>
<li><strong>Version Updates:</strong> Fixed issues where version fields were incorrectly skipped during optimistic locking updates.</li>
<li><strong>Inverse Relations:</strong> Added robust support for resolving both one-to-many and one-to-one inverse relations during relation loading.</li>
<li><strong>Schema Migration:</strong> Stripped identifier quotes before comparing columns to prevent unnecessary migrations on MySQL/Postgres.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="️-breaking-changes">⚠️ Breaking Changes<a href="https://teaql.io/blog/teaql-1-0-0-release#%EF%B8%8F-breaking-changes" class="hash-link" aria-label="Direct link to ⚠️ Breaking Changes" title="Direct link to ⚠️ Breaking Changes">​</a></h2>
<ol>
<li><strong>Repository Access:</strong> Manual instantiation of <code>TaskRepository</code> or <code>QueryCommentGuard</code> is strictly deprecated and removed. Use <code>.audit_as("Save operation").save(&amp;ctx)</code> on the entity.</li>
<li><strong>Query Prefixes:</strong> Any existing code using <code>which_</code> must be updated to use <code>with_</code>.</li>
<li><strong>Audit Log Enforcement:</strong> Calling <code>.audit_as("Save operation").save(&amp;ctx)</code> on core entities will now strictly mandate the presence of an audit comment via <code>.set_comment()</code>.</li>
</ol>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="-upgrading">📦 Upgrading<a href="https://teaql.io/blog/teaql-1-0-0-release#-upgrading" class="hash-link" aria-label="Direct link to 📦 Upgrading" title="Direct link to 📦 Upgrading">​</a></h2>
<p><strong>For Rust users:</strong>
Update your <code>Cargo.toml</code>:</p>
<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">teaql-core = "1.0.0"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">teaql-macros = "1.0.0"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">teaql-runtime = "1.0.0"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">teaql-provider-sqlx-postgres = "1.0.0"</span><br></span></code></pre></div></div>
<p><strong>For Java/Spring Boot users:</strong>
Update your Maven/Gradle plugin version to <code>1.0.0</code> and regenerate your project.</p>
<hr>
<p><em>Thank you to all contributors who helped test the beta versions leading up to 1.0.0! Happy coding! ☕</em></p>]]></content:encoded>
            <category>teaql</category>
            <category>release</category>
            <category>rust</category>
            <category>java</category>
            <category>spring-boot</category>
        </item>
        <item>
            <title><![CDATA[Enforcing Request Policy at the Runtime Boundary]]></title>
            <link>https://teaql.io/blog/enforce-request-policy-multi-tenant-data-boundaries</link>
            <guid>https://teaql.io/blog/enforce-request-policy-multi-tenant-data-boundaries</guid>
            <pubDate>Thu, 21 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[How TeaQL uses runtime request policy hooks to protect infrastructure and customer data in a multi-tenant talent platform.]]></description>
            <content:encoded><![CDATA[<p>In a multi-tenant business system, the dangerous query is often not obviously
dangerous.</p>
<p>A developer writes a useful request:</p>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Q.candidates().selectName()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    .selectEmail()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    .filterBySkill("Java")</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    .page(1, 20)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    .comment("Query candidates").purpose("Load data")</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    .executeForList(ctx);</span><br></span></code></pre></div></div>
<p>The request looks typed, generated, and harmless. But in a platform like Multi
Talent, a candidate belongs to a customer account, a workspace, a recruiter
team, and often a legal region. A useful query becomes unsafe if it can see
outside those boundaries.</p>
<p>That is why TeaQL treats request execution as a runtime boundary, not just a
method call.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-multi-talent-problem">The Multi Talent Problem<a href="https://teaql.io/blog/enforce-request-policy-multi-tenant-data-boundaries#the-multi-talent-problem" class="hash-link" aria-label="Direct link to The Multi Talent Problem" title="Direct link to The Multi Talent Problem">​</a></h2>
<p>Imagine Multi Talent as a SaaS platform for recruiting agencies and enterprise
hiring teams.</p>
<p>The same TeaQL model may include:</p>
<ul>
<li>candidates;</li>
<li>talent profiles;</li>
<li>resumes and attachments;</li>
<li>interview records;</li>
<li>offer workflows;</li>
<li>customer accounts;</li>
<li>recruiter teams;</li>
<li>regional compliance metadata.</li>
</ul>
<p>The query language should stay expressive. A team should be able to search
candidates by skill, location, availability, interview status, and related job
opening.</p>
<p>But every query must also respect infrastructure and customer boundaries:</p>
<ul>
<li>customer A must never read customer B's candidates;</li>
<li>a recruiter can only see candidates assigned to their team or allowed pool;</li>
<li>regional data residency policy may limit which records can be loaded;</li>
<li>raw SQL escape hatches should not bypass tenant rules;</li>
<li>unlimited list requests should not become infrastructure abuse.</li>
</ul>
<p>Those rules should not be copied into every controller.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-wrong-place-for-the-rule">The Wrong Place for the Rule<a href="https://teaql.io/blog/enforce-request-policy-multi-tenant-data-boundaries#the-wrong-place-for-the-rule" class="hash-link" aria-label="Direct link to The Wrong Place for the Rule" title="Direct link to The Wrong Place for the Rule">​</a></h2>
<p>One option is to add filters wherever a query is written:</p>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Q.candidates().filterByCustomer(ctx.currentCustomer())</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    .filterByRecruiterTeam(ctx.currentTeam())</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    .filterBySkill("Java")</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    .comment("Query candidates").purpose("Load data")</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    .executeForList(ctx);</span><br></span></code></pre></div></div>
<p>This works until one path forgets the filter. It also asks every feature author
to understand every infrastructure and data-protection rule.</p>
<p>Another option is to hide the query behind service methods. That can work for
some workflows, but TeaQL deliberately gives teams a generated request language.
The runtime should make that language safe instead of forcing teams to abandon
it.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-runtime-boundary">The Runtime Boundary<a href="https://teaql.io/blog/enforce-request-policy-multi-tenant-data-boundaries#the-runtime-boundary" class="hash-link" aria-label="Direct link to The Runtime Boundary" title="Direct link to The Runtime Boundary">​</a></h2>
<p>TeaQL Java runtime exposes a dedicated <code>UserContext</code> extension point for this
final step:</p>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">protected &lt;T extends Entity&gt; SearchRequest&lt;T&gt; enforceRequestPolicy(SearchRequest&lt;T&gt; request) {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    return request;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre></div></div>
<p>Every normal request execution path goes through this hook before the request is
submitted to the repository:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">SearchRequest</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  -&gt; UserContext</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  -&gt; enforceRequestPolicy(...)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  -&gt; Repository</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  -&gt; database provider</span><br></span></code></pre></div></div>
<p>That placement matters. It is late enough to see the actual request that is
about to execute, but still early enough to change it or reject it.</p>
<p>TeaQL Rust has the same runtime-boundary idea through <code>RequestPolicy</code> on
<code>UserContext</code>. The Rust hook is platform-scoped and runs after entity-scoped
repository behavior, so it can make the final decision before the request
reaches the provider.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="a-multi-talent-policy">A Multi Talent Policy<a href="https://teaql.io/blog/enforce-request-policy-multi-tenant-data-boundaries#a-multi-talent-policy" class="hash-link" aria-label="Direct link to A Multi Talent Policy" title="Direct link to A Multi Talent Policy">​</a></h2>
<p>A Multi Talent project can extend its generated context and enforce the policy
once:</p>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">public class MultiTalentUserContext extends MultiTalentGeneratedUserContext {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    @Override</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    protected &lt;T extends Entity&gt; SearchRequest&lt;T&gt; enforceRequestPolicy(SearchRequest&lt;T&gt; request) {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        request = super.enforceRequestPolicy(request);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        String type = request.getTypeName();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        if ("Candidate".equals(type) || "TalentProfile".equals(type)) {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            request.appendSearchCriteria(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    request.createBasicSearchCriteria(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                            "customerAccount",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                            Operator.EQUAL,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                            currentCustomerAccount()));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            request.appendSearchCriteria(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    request.createBasicSearchCriteria(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                            "recruiterTeam",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                            Operator.IN,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                            visibleRecruiterTeams()));</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        if ("ResumeAttachment".equals(type)) {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            enforceRegionalAccess(type);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        rejectDangerousRequestShape(request);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        auditSensitiveRead(request);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        return request;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre></div></div>
<p>The example is intentionally centralized. Feature code can still express the
business query:</p>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Q.candidates().selectName()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    .selectEmail()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    .filterBySkill("Java")</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    .page(1, 20)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    .comment("Query candidates").purpose("Load data")</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    .executeForList(ctx);</span><br></span></code></pre></div></div>
<p>The runtime adds the customer and team boundaries before the repository sees
the request.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="protecting-more-than-rows">Protecting More Than Rows<a href="https://teaql.io/blog/enforce-request-policy-multi-tenant-data-boundaries#protecting-more-than-rows" class="hash-link" aria-label="Direct link to Protecting More Than Rows" title="Direct link to Protecting More Than Rows">​</a></h2>
<p>The hook is not only about tenant IDs.</p>
<p>In a real platform, request policy can protect infrastructure as well as data:</p>
<ul>
<li>reject <code>rawSql</code> for normal users;</li>
<li>cap page size for list views;</li>
<li>block <code>unlimited()</code> on high-volume entities;</li>
<li>add region or data residency predicates;</li>
<li>require extra audit for sensitive reads;</li>
<li>remove unsafe relation loading for restricted roles;</li>
<li>attach request comments or markers for tracing.</li>
</ul>
<p>For example:</p>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">private void rejectDangerousRequestShape(SearchRequest&lt;?&gt; request) {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    if (request.getRawSql() != null &amp;&amp; !currentUserCanUseRawSql()) {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        throw new AccessDeniedException("Raw SQL is not allowed for this user");</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    Slice slice = request.getSlice();</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    if (slice != null &amp;&amp; slice.getSize() &gt; 200) {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        slice.setSize(200);</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre></div></div>
<p>This is infrastructure protection. It prevents one feature path from turning
into a full-table scan, an accidental data export, or an expensive cross-tenant
aggregation.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="why-usercontext-is-the-right-place">Why UserContext Is the Right Place<a href="https://teaql.io/blog/enforce-request-policy-multi-tenant-data-boundaries#why-usercontext-is-the-right-place" class="hash-link" aria-label="Direct link to Why UserContext Is the Right Place" title="Direct link to Why UserContext Is the Right Place">​</a></h2>
<p><code>UserContext</code> already knows the runtime facts needed to enforce policy:</p>
<ul>
<li>the current customer or tenant;</li>
<li>the current operator;</li>
<li>roles, teams, and permissions;</li>
<li>request headers and trace ID;</li>
<li>client IP and proxy chain;</li>
<li>environment-level beans and services;</li>
<li>audit and logging services.</li>
</ul>
<p>Repositories should not need to know every business permission model.
Controllers should not need to repeat low-level safety rules. The generated
request API should remain readable.</p>
<p><code>UserContext</code> is the convergence point.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="auditing-sensitive-reads">Auditing Sensitive Reads<a href="https://teaql.io/blog/enforce-request-policy-multi-tenant-data-boundaries#auditing-sensitive-reads" class="hash-link" aria-label="Direct link to Auditing Sensitive Reads" title="Direct link to Auditing Sensitive Reads">​</a></h2>
<p>Because the hook sees the final request, it is also a useful place to audit
sensitive reads:</p>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">private void auditSensitiveRead(SearchRequest&lt;?&gt; request) {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    if (!"Candidate".equals(request.getTypeName())) {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        return;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    auditTrail().recordRead(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            traceId(),</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            currentCustomerAccountId(),</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            currentUserId(),</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            request.getTypeName(),</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            request.comment(),</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            getClientIp());</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}</span><br></span></code></pre></div></div>
<p>This does not replace business-level audit records such as "approved offer" or
"revoked recruiter access." It complements them by making sensitive data access
observable at the runtime boundary.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-design-principle">The Design Principle<a href="https://teaql.io/blog/enforce-request-policy-multi-tenant-data-boundaries#the-design-principle" class="hash-link" aria-label="Direct link to The Design Principle" title="Direct link to The Design Principle">​</a></h2>
<p>Generated APIs should make business intent visible.</p>
<p>Runtime policy should make that intent safe to execute.</p>
<p>In Multi Talent, a query for candidates should read like a query for candidates.
It should not be filled with repeated customer, team, residency, audit, and
infrastructure rules. Those rules belong at the boundary where a request is
submitted to the runtime.</p>
<p>That is what <code>enforceRequestPolicy</code> is for.</p>
<p>In Rust, the same idea is expressed as a <code>RequestPolicy</code>:</p>
<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">teaql_core</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">::</span><span class="token punctuation" style="color:#393A34">{</span><span class="token class-name">Expr</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">SelectQuery</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">use</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">teaql_runtime</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">::</span><span class="token punctuation" style="color:#393A34">{</span><span class="token class-name">RequestPolicy</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">RuntimeError</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">UserContext</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">pub</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">struct</span><span class="token plain"> </span><span class="token type-definition class-name">MultiTalentPolicy</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">impl</span><span class="token plain"> </span><span class="token class-name">RequestPolicy</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> </span><span class="token class-name">MultiTalentPolicy</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">fn</span><span class="token plain"> </span><span class="token function-definition function" style="color:#d73a49">enforce_select</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token keyword" style="color:#00009f">self</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        ctx</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token class-name">UserContext</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        query</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;</span><span class="token keyword" style="color:#00009f">mut</span><span class="token plain"> </span><span class="token class-name">SelectQuery</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">-&gt;</span><span class="token plain"> </span><span class="token class-name">Result</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token class-name">RuntimeError</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token macro property" style="color:#36acaa">matches!</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">query</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">entity</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">as_str</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Candidate"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">|</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"TalentProfile"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> customer_id </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> ctx</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">get_named_resource</span><span class="token punctuation" style="color:#393A34">::</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token keyword" style="color:#00009f">u64</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"customer_account_id"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">copied</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">ok_or_else</span><span class="token punctuation" style="color:#393A34">(</span><span class="token closure-params closure-punctuation punctuation" style="color:#393A34">|</span><span class="token closure-params closure-punctuation punctuation" style="color:#393A34">|</span><span class="token plain"> </span><span class="token class-name">RuntimeError</span><span class="token punctuation" style="color:#393A34">::</span><span class="token class-name">Policy</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"missing customer account"</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">to_owned</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">?</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> tenant_filter </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Expr</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">eq</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"customer_account_id"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> customer_id</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            query</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">filter </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Some</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">match</span><span class="token plain"> query</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">filter</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">take</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token class-name">Some</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">existing</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> existing</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">and_expr</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">tenant_filter</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token class-name">None</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> tenant_filter</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> query</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">raw_sql</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">is_some</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token class-name">Err</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">RuntimeError</span><span class="token punctuation" style="color:#393A34">::</span><span class="token class-name">Policy</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token string" style="color:#e3116c">"raw SQL is not allowed for normal users"</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">to_owned</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name">Ok</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></span></code></pre></div></div>
<p>Register it during runtime assembly:</p>
<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> ctx </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token namespace" style="opacity:0.7">teaql_runtime</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">::</span><span class="token class-name">UserContext</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">new</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">with_module</span><span class="token punctuation" style="color:#393A34">(</span><span class="token namespace" style="opacity:0.7">multi_talent</span><span class="token namespace punctuation" style="opacity:0.7;color:#393A34">::</span><span class="token function" style="color:#d73a49">module_with_behaviors_and_checkers</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">with_request_policy</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">MultiTalentPolicy</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p>Java uses <code>UserContext.enforceRequestPolicy</code>. Rust uses <code>RequestPolicy</code>. The
design principle is the same: TeaQL projects get a final, explicit place to
protect the platform and the customer's data before a request reaches the
repository.</p>]]></content:encoded>
            <category>teaql</category>
            <category>runtime</category>
            <category>security</category>
            <category>multi-tenant</category>
            <category>user-context</category>
        </item>
        <item>
            <title><![CDATA[Generated APIs for domain-driven development]]></title>
            <link>https://teaql.io/blog/generated-apis-for-domain-driven-development</link>
            <guid>https://teaql.io/blog/generated-apis-for-domain-driven-development</guid>
            <pubDate>Thu, 14 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Generated TeaQL APIs keep the domain model visible in application code, query construction, relation loading, validation, and graph persistence.]]></description>
            <content:encoded><![CDATA[<p>Domain-driven development breaks down when the domain language disappears from the code path.</p>
<p>That happens easily in data-heavy systems. The model may be discussed in design sessions, but implementation code becomes SQL strings, mapper files, repository methods, DTOs, and service glue.</p>
<p>TeaQL uses generated APIs to keep the domain model visible.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="model-first">Model First<a href="https://teaql.io/blog/generated-apis-for-domain-driven-development#model-first" class="hash-link" aria-label="Direct link to Model First" title="Direct link to Model First">​</a></h2>
<p>TeaQL starts from a domain model:</p>
<ul>
<li>entities;</li>
<li>scalar fields;</li>
<li>object relations;</li>
<li>child lists;</li>
<li>constants;</li>
<li>validation expectations;</li>
<li>data-service targets.</li>
</ul>
<p>The generator turns that model into APIs. Application code then works with the generated vocabulary instead of reconstructing it by hand.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="queries-as-domain-language">Queries as Domain Language<a href="https://teaql.io/blog/generated-apis-for-domain-driven-development#queries-as-domain-language" class="hash-link" aria-label="Direct link to Queries as Domain Language" title="Direct link to Queries as Domain Language">​</a></h2>
<p>Generated query methods make intent explicit:</p>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Q.orders().filterByMerchant(ctx.getMerchant())</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    .selectCustomer(Q.customers().comment("Query customers").purpose("Load data").selectName())</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    .selectLineItemList(Q.lineItems().selectSku().selectQuantity())</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    .countLineItems()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    .comment("Query orders").purpose("Load data")</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    .executeForList(ctx);</span><br></span></code></pre></div></div>
<p>The code names the domain structure:</p>
<ul>
<li>orders;</li>
<li>merchant;</li>
<li>customer;</li>
<li>line items;</li>
<li>SKU;</li>
<li>quantity.</li>
</ul>
<p>That is more reviewable than a service method that hides several mapper calls and response transformations.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="relations-matter">Relations Matter<a href="https://teaql.io/blog/generated-apis-for-domain-driven-development#relations-matter" class="hash-link" aria-label="Direct link to Relations Matter" title="Direct link to Relations Matter">​</a></h2>
<p>DDD systems are rarely flat. Relations carry meaning:</p>
<ul>
<li>an order has line items;</li>
<li>a merchant belongs to a platform;</li>
<li>an employee belongs to a department;</li>
<li>a ticket has comments and assignments.</li>
</ul>
<p>TeaQL relation loading APIs give those relationships a generated shape. The runtime can still decide how to execute the load efficiently.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="graph-writes">Graph Writes<a href="https://teaql.io/blog/generated-apis-for-domain-driven-development#graph-writes" class="hash-link" aria-label="Direct link to Graph Writes" title="Direct link to Graph Writes">​</a></h2>
<p>Domain changes often arrive as object graphs:</p>
<ul>
<li>create an order with lines;</li>
<li>update a parent and merge children;</li>
<li>remove a child row;</li>
<li>attach an existing reference;</li>
<li>keep missing children for a relation that should not delete absent rows.</li>
</ul>
<p>TeaQL Rust models this through graph nodes, graph operation state, mutation planning, and transaction boundaries. Java TeaQL carries the same high-level idea through entity save and graph-oriented runtime behavior.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="validation-and-runtime-policy">Validation and Runtime Policy<a href="https://teaql.io/blog/generated-apis-for-domain-driven-development#validation-and-runtime-policy" class="hash-link" aria-label="Direct link to Validation and Runtime Policy" title="Direct link to Validation and Runtime Policy">​</a></h2>
<p>Domain logic is not only data shape. It also includes:</p>
<ul>
<li>required fields;</li>
<li>status transitions;</li>
<li>tenant rules;</li>
<li>permission policy;</li>
<li>audit metadata;</li>
<li>language-aware validation messages.</li>
</ul>
<p>TeaQL keeps those concerns near runtime context and generated model hooks instead of scattering them across controllers.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="why-generate">Why Generate?<a href="https://teaql.io/blog/generated-apis-for-domain-driven-development#why-generate" class="hash-link" aria-label="Direct link to Why Generate?" title="Direct link to Why Generate?">​</a></h2>
<p>Handwritten domain APIs are possible. The problem is consistency.</p>
<p>Generation gives every entity the same baseline:</p>
<ul>
<li>field selectors;</li>
<li>filters;</li>
<li>relation selectors;</li>
<li>aggregate helpers;</li>
<li>request builders;</li>
<li>checker hooks;</li>
<li>behavior hooks;</li>
<li>runtime registration.</li>
</ul>
<p>Teams can then focus on the parts of the domain that are actually special.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-short-version">The Short Version<a href="https://teaql.io/blog/generated-apis-for-domain-driven-development#the-short-version" class="hash-link" aria-label="Direct link to The Short Version" title="Direct link to The Short Version">​</a></h2>
<p>Generated APIs are not a shortcut around domain modeling.</p>
<p>They are a way to make the domain model executable, reviewable, and reusable across application code, runtime providers, and AI coding tools.</p>]]></content:encoded>
            <category>ddd</category>
            <category>codegen</category>
            <category>teaql</category>
            <category>api</category>
            <category>domain-model</category>
        </item>
        <item>
            <title><![CDATA[TeaQL is not just an ORM]]></title>
            <link>https://teaql.io/blog/teaql-is-not-just-an-orm</link>
            <guid>https://teaql.io/blog/teaql-is-not-just-an-orm</guid>
            <pubDate>Thu, 14 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[TeaQL uses ORM-like persistence only as one part of a larger generated business API and runtime model.]]></description>
            <content:encoded><![CDATA[<p>It is tempting to describe TeaQL as an ORM because TeaQL knows about entities, relations, repositories, and databases.</p>
<p>That description is incomplete.</p>
<p>TeaQL is a generated business API layer. Persistence is one part of the system, but the main value is the generated domain language that sits above persistence.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-an-orm-usually-optimizes">What an ORM Usually Optimizes<a href="https://teaql.io/blog/teaql-is-not-just-an-orm#what-an-orm-usually-optimizes" class="hash-link" aria-label="Direct link to What an ORM Usually Optimizes" title="Direct link to What an ORM Usually Optimizes">​</a></h2>
<p>Most ORM discussions focus on mapping:</p>
<ul>
<li>classes to tables;</li>
<li>fields to columns;</li>
<li>relations to joins;</li>
<li>objects to rows;</li>
<li>transactions to persistence sessions.</li>
</ul>
<p>Those are real problems. TeaQL also needs to solve them. But large business systems have another repeated problem: the same business request is rebuilt again and again in controllers, repositories, DTOs, SQL, validators, and frontend response logic.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-teaql-optimizes">What TeaQL Optimizes<a href="https://teaql.io/blog/teaql-is-not-just-an-orm#what-teaql-optimizes" class="hash-link" aria-label="Direct link to What TeaQL Optimizes" title="Direct link to What TeaQL Optimizes">​</a></h2>
<p>TeaQL optimizes the business API surface.</p>
<p>It generates request APIs that can express:</p>
<ul>
<li>selection;</li>
<li>nested relation loading;</li>
<li>filters;</li>
<li>list-existence queries;</li>
<li>pagination;</li>
<li>grouped statistics;</li>
<li>relation aggregates;</li>
<li>graph writes;</li>
<li>validation hooks;</li>
<li>runtime customization.</li>
</ul>
<p>The generated API is meant to be read by backend engineers, domain engineers, reviewers, and AI coding tools.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="generated-business-apis">Generated Business APIs<a href="https://teaql.io/blog/teaql-is-not-just-an-orm#generated-business-apis" class="hash-link" aria-label="Direct link to Generated Business APIs" title="Direct link to Generated Business APIs">​</a></h2>
<p>An ORM might make it easy to load an <code>Order</code>.</p>
<p>TeaQL aims to make it clear how a complete order page is assembled:</p>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Q.orders().filterByMerchant(ctx.getMerchant())</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    .selectCustomer(Q.customers().comment("Query customers").purpose("Load data").selectName())</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    .selectLineItemList(Q.lineItems().selectSku().selectQuantity())</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    .countLineItems()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    .orderByCreateTimeDescending()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    .page(1, 20)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    .comment("Query orders").purpose("Load data")</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    .executeForList(ctx);</span><br></span></code></pre></div></div>
<p>The key is not whether this compiles to SQL. It does. The key is that the API names the business shape before the runtime turns it into storage operations.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="runtime-boundary">Runtime Boundary<a href="https://teaql.io/blog/teaql-is-not-just-an-orm#runtime-boundary" class="hash-link" aria-label="Direct link to Runtime Boundary" title="Direct link to Runtime Boundary">​</a></h2>
<p>TeaQL also treats runtime behavior as part of the model:</p>
<ul>
<li>user context;</li>
<li>tenant and permission policy;</li>
<li>cache behavior;</li>
<li>distributed locks;</li>
<li>logging and metrics;</li>
<li>validation;</li>
<li>event dispatch;</li>
<li>database provider selection.</li>
</ul>
<p>That is why TeaQL has a runtime layer instead of only a mapper layer.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="why-this-helps-ai">Why This Helps AI<a href="https://teaql.io/blog/teaql-is-not-just-an-orm#why-this-helps-ai" class="hash-link" aria-label="Direct link to Why This Helps AI" title="Direct link to Why This Helps AI">​</a></h2>
<p>AI tools should not need to guess SQL, join rules, table names, tenant filters, and response shapes from scattered code.</p>
<p>Generated APIs give AI tools a deterministic vocabulary:</p>
<ul>
<li>call this field selector;</li>
<li>use this relation loader;</li>
<li>compose this query fragment;</li>
<li>execute through this runtime context;</li>
<li>do not bypass the provider.</li>
</ul>
<p>That is a different goal from a traditional ORM.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-short-version">The Short Version<a href="https://teaql.io/blog/teaql-is-not-just-an-orm#the-short-version" class="hash-link" aria-label="Direct link to The Short Version" title="Direct link to The Short Version">​</a></h2>
<p>TeaQL uses persistence mapping, but it is not defined by persistence mapping.</p>
<p>It is a generated business API platform that keeps domain intent visible while allowing the runtime provider to change underneath.</p>]]></content:encoded>
            <category>teaql</category>
            <category>orm</category>
            <category>ddd</category>
            <category>runtime</category>
            <category>query</category>
        </item>
        <item>
            <title><![CDATA[TeaQL Runtime Providers: PostgreSQL, MySQL, SQLite]]></title>
            <link>https://teaql.io/blog/teaql-runtime-providers-postgresql-mysql-sqlite</link>
            <guid>https://teaql.io/blog/teaql-runtime-providers-postgresql-mysql-sqlite</guid>
            <pubDate>Thu, 14 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[TeaQL Rust providers let generated business APIs execute against PostgreSQL, MySQL, SQLite, embedded SQLite, or memory.]]></description>
            <content:encoded><![CDATA[<p>TeaQL Rust uses runtime providers to keep generated business APIs separate from storage execution.</p>
<p>The application code should use the generated API. The runtime should decide how that API executes against PostgreSQL, MySQL, SQLite, embedded SQLite, or memory.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="provider-matrix">Provider Matrix<a href="https://teaql.io/blog/teaql-runtime-providers-postgresql-mysql-sqlite#provider-matrix" class="hash-link" aria-label="Direct link to Provider Matrix" title="Direct link to Provider Matrix">​</a></h2>
<table><thead><tr><th>Provider</th><th>Best for</th></tr></thead><tbody><tr><td>SQLx PostgreSQL</td><td>production-grade backend services, complex queries, transactions, aggregation</td></tr><tr><td>SQLx MySQL</td><td>enterprise MySQL systems and migration scenarios</td></tr><tr><td>SQLx SQLite</td><td>local-first apps, tests, lightweight services</td></tr><tr><td>rusqlite SQLite</td><td>embedded, router, edge, sync execution, multi-architecture devices</td></tr><tr><td>MemoryRepository</td><td>no-database tests, demos, fast model validation</td></tr></tbody></table>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="postgresql">PostgreSQL<a href="https://teaql.io/blog/teaql-runtime-providers-postgresql-mysql-sqlite#postgresql" class="hash-link" aria-label="Direct link to PostgreSQL" title="Direct link to PostgreSQL">​</a></h2>
<p>PostgreSQL is the strongest default for production backend systems that need:</p>
<ul>
<li>transactions;</li>
<li>rich query behavior;</li>
<li>grouped aggregation;</li>
<li>Decimal/NUMERIC support;</li>
<li>schema bootstrap;</li>
<li>id-space generation;</li>
<li>production database tooling.</li>
</ul>
<p>TeaQL's SQLx PostgreSQL provider keeps PostgreSQL-specific execution behind the repository boundary.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="mysql">MySQL<a href="https://teaql.io/blog/teaql-runtime-providers-postgresql-mysql-sqlite#mysql" class="hash-link" aria-label="Direct link to MySQL" title="Direct link to MySQL">​</a></h2>
<p>MySQL remains common in enterprise business systems. TeaQL's SQLx MySQL provider is intended for teams that want generated business APIs while staying on a familiar MySQL backend.</p>
<p>This is especially useful when moving away from handwritten mapper-heavy persistence without moving the database first.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="sqlite">SQLite<a href="https://teaql.io/blog/teaql-runtime-providers-postgresql-mysql-sqlite#sqlite" class="hash-link" aria-label="Direct link to SQLite" title="Direct link to SQLite">​</a></h2>
<p>SQLite has two important TeaQL paths.</p>
<p>SQLx SQLite is useful for async local-first apps, integration tests, small services, and portable demos.</p>
<p>rusqlite is useful when synchronous embedded SQLite is a better fit:</p>
<ul>
<li>devices;</li>
<li>routers;</li>
<li>edge deployments;</li>
<li>appliance controllers;</li>
<li>local agent memory.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="memoryrepository">MemoryRepository<a href="https://teaql.io/blog/teaql-runtime-providers-postgresql-mysql-sqlite#memoryrepository" class="hash-link" aria-label="Direct link to MemoryRepository" title="Direct link to MemoryRepository">​</a></h2>
<p>Not every generated API test needs a database.</p>
<p>MemoryRepository gives TeaQL a no-database path for:</p>
<ul>
<li>unit tests;</li>
<li>model validation;</li>
<li>lightweight demos;</li>
<li>fast runtime simulation.</li>
</ul>
<p>The goal is to test generated API behavior without requiring a database server.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="runtime-assembly">Runtime Assembly<a href="https://teaql.io/blog/teaql-runtime-providers-postgresql-mysql-sqlite#runtime-assembly" class="hash-link" aria-label="Direct link to Runtime Assembly" title="Direct link to Runtime Assembly">​</a></h2>
<p>The provider is registered below <code>UserContext</code>:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Generated service crate</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  -&gt; RuntimeModule</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  -&gt; UserContext</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  -&gt; Repository API</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  -&gt; selected provider</span><br></span></code></pre></div></div>
<p>Generated crates can expose helpers for module registration, behavior/checker registration, provider-backed runtime setup, and schema bootstrap.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="why-providers-matter">Why Providers Matter<a href="https://teaql.io/blog/teaql-runtime-providers-postgresql-mysql-sqlite#why-providers-matter" class="hash-link" aria-label="Direct link to Why Providers Matter" title="Direct link to Why Providers Matter">​</a></h2>
<p>Without a provider boundary, application code tends to mix business intent with database details.</p>
<p>With providers, the generated API remains stable:</p>
<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token class-name">Q</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">platforms</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">select_merchant_list_with</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Q</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">merchants</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">comment</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Query merchants"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">purpose</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Load data"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">select_name</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">comment</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Query platforms"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">purpose</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Load data"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">execute_for_list</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">ctx</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword" style="color:#00009f">await</span><span class="token operator" style="color:#393A34">?</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p>The runtime decides whether that request executes through PostgreSQL, MySQL, SQLite, rusqlite, or memory.</p>
<p>That is the point of TeaQL's multi-database runtime direction.</p>]]></content:encoded>
            <category>rust</category>
            <category>postgresql</category>
            <category>mysql</category>
            <category>sqlite</category>
            <category>runtime</category>
        </item>
        <item>
            <title><![CDATA[TeaQL Rust: From Java Feature Parity to Multi-database Runtime]]></title>
            <link>https://teaql.io/blog/teaql-rust-from-java-feature-parity-to-multi-database-runtime</link>
            <guid>https://teaql.io/blog/teaql-rust-from-java-feature-parity-to-multi-database-runtime</guid>
            <pubDate>Thu, 14 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[TeaQL Rust carries over the useful Java programming model while rebuilding the runtime around Rust crates and database-specific providers.]]></description>
            <content:encoded><![CDATA[<p>TeaQL started with a mature Java implementation. The Rust work does not try to clone every Java framework feature. It carries over the high-level programming model and rebuilds the runtime in Rust.</p>
<p>That shift matters.</p>
<p>Java proved the generated business API style. Rust turns that style into a runtime direction for PostgreSQL, MySQL, SQLite, embedded SQLite, and memory-backed tests.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-carries-over-from-java">What Carries Over from Java<a href="https://teaql.io/blog/teaql-rust-from-java-feature-parity-to-multi-database-runtime#what-carries-over-from-java" class="hash-link" aria-label="Direct link to What Carries Over from Java" title="Direct link to What Carries Over from Java">​</a></h2>
<p>The useful Java ideas are not Spring-specific. They are TeaQL-specific:</p>
<ul>
<li>generated <code>Q</code> APIs;</li>
<li>readable query builders;</li>
<li>field and relation selectors;</li>
<li><code>SmartList</code> style result metadata;</li>
<li>runtime context;</li>
<li>checker infrastructure;</li>
<li>translated validation messages;</li>
<li>mutation events;</li>
<li>graph writes;</li>
<li>relation enhancement;</li>
<li>relation aggregate enhancement;</li>
<li>safe value access.</li>
</ul>
<p>Rust implements those ideas with Rust types, traits, crates, and provider registration.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-does-not-carry-over-directly">What Does Not Carry Over Directly<a href="https://teaql.io/blog/teaql-rust-from-java-feature-parity-to-multi-database-runtime#what-does-not-carry-over-directly" class="hash-link" aria-label="Direct link to What Does Not Carry Over Directly" title="Direct link to What Does Not Carry Over Directly">​</a></h2>
<p>Some Java features should not be copied blindly:</p>
<ul>
<li>Spring Boot autoconfiguration;</li>
<li>Java GraphQL generation;</li>
<li>Java BaseService/controller conventions;</li>
<li>reflection-style runtime mechanisms;</li>
<li>the full Java database dialect matrix.</li>
</ul>
<p>Rust needs a Rust-native shape. The runtime should be explicit, crate-based, and provider-backed.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-rust-workspace">The Rust Workspace<a href="https://teaql.io/blog/teaql-rust-from-java-feature-parity-to-multi-database-runtime#the-rust-workspace" class="hash-link" aria-label="Direct link to The Rust Workspace" title="Direct link to The Rust Workspace">​</a></h2>
<p>The Rust runtime is split by responsibility:</p>
<ul>
<li><code>teaql-core</code> for metadata, values, query model, entity traits, and <code>SmartList&lt;T&gt;</code>;</li>
<li><code>teaql-sql</code> for SQL compilation and dialect behavior;</li>
<li><code>teaql-runtime</code> for <code>UserContext</code>, repositories, checkers, events, relation enhancement, graph writes, and memory execution;</li>
<li><code>teaql-macros</code> for <code>#[derive(TeaqlEntity)]</code>;</li>
<li>provider crates for SQLx PostgreSQL, SQLx MySQL, SQLx SQLite, and rusqlite SQLite.</li>
</ul>
<p>This keeps the core runtime separate from database adapters.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="generated-rust-crates">Generated Rust Crates<a href="https://teaql.io/blog/teaql-rust-from-java-feature-parity-to-multi-database-runtime#generated-rust-crates" class="hash-link" aria-label="Direct link to Generated Rust Crates" title="Direct link to Generated Rust Crates">​</a></h2>
<p><code>teaql-code-gen</code> can emit Rust service crates. A generated crate can include:</p>
<ul>
<li>entity structs;</li>
<li><code>Q</code> facade;</li>
<li>generated request builders;</li>
<li>behavior skeletons;</li>
<li>checker skeletons;</li>
<li>runtime module registration;</li>
<li>repository and behavior registries;</li>
<li>provider-backed runtime helpers.</li>
</ul>
<p>Application code then uses generated APIs:</p>
<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> platforms </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Q</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">platforms</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">select_merchant_list_with</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token class-name">Q</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">merchants</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">comment</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Query merchants"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">purpose</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Load data"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">select_name</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">which_names_contain</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"TeaQL"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">comment</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Query platforms"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">purpose</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Load data"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">execute_for_list</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">ctx</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword" style="color:#00009f">await</span><span class="token operator" style="color:#393A34">?</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="multi-database-runtime">Multi-database Runtime<a href="https://teaql.io/blog/teaql-rust-from-java-feature-parity-to-multi-database-runtime#multi-database-runtime" class="hash-link" aria-label="Direct link to Multi-database Runtime" title="Direct link to Multi-database Runtime">​</a></h2>
<p>The Rust direction is provider-based:</p>
<ul>
<li>SQLx PostgreSQL for production-grade PostgreSQL backends;</li>
<li>SQLx MySQL for common enterprise MySQL systems;</li>
<li>SQLx SQLite for local-first apps, tests, and small services;</li>
<li>rusqlite SQLite for embedded and multi-architecture deployments;</li>
<li>MemoryRepository for no-database tests and demos.</li>
</ul>
<p>The generated API should stay stable while the provider changes below it.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="current-state">Current State<a href="https://teaql.io/blog/teaql-rust-from-java-feature-parity-to-multi-database-runtime#current-state" class="hash-link" aria-label="Direct link to Current State" title="Direct link to Current State">​</a></h2>
<p>The Rust runtime is already useful for core generated-domain paths:</p>
<ul>
<li>typed queries;</li>
<li>relation loading;</li>
<li>grouped aggregates;</li>
<li>graph writes;</li>
<li>checkers;</li>
<li>events;</li>
<li>schema bootstrap;</li>
<li>SQL debug logs;</li>
<li>generated high-level <code>Q</code> API validation against SQLite and PostgreSQL paths.</li>
</ul>
<p>Full Java feature parity is not the only metric. The better metric is whether Rust has a coherent generated business API runtime.</p>
<p>That is now the direction.</p>]]></content:encoded>
            <category>rust</category>
            <category>java</category>
            <category>runtime</category>
            <category>database</category>
            <category>codegen</category>
        </item>
        <item>
            <title><![CDATA[TeaQL vs MyBatis: an order page example]]></title>
            <link>https://teaql.io/blog/teaql-vs-mybatis-order-page-example</link>
            <guid>https://teaql.io/blog/teaql-vs-mybatis-order-page-example</guid>
            <pubDate>Thu, 14 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[A practical comparison of building an order page with mapper-oriented persistence versus TeaQL generated business APIs.]]></description>
            <content:encoded><![CDATA[<p>MyBatis is a productive and familiar tool for Java teams. It gives developers direct control over SQL and mapping. For many simple services, that is enough.</p>
<p>The pressure appears when a business page needs more than one table and more than one query shape.</p>
<p>Consider an order page.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-order-page-shape">The Order Page Shape<a href="https://teaql.io/blog/teaql-vs-mybatis-order-page-example#the-order-page-shape" class="hash-link" aria-label="Direct link to The Order Page Shape" title="Direct link to The Order Page Shape">​</a></h2>
<p>A typical order page may need:</p>
<ul>
<li>the order list;</li>
<li>customer name;</li>
<li>order status;</li>
<li>line item preview;</li>
<li>line item count;</li>
<li>status counts for tabs;</li>
<li>pagination;</li>
<li>merchant or tenant filtering;</li>
<li>permission-aware visibility.</li>
</ul>
<p>With mapper-oriented persistence, this often becomes several mapper methods, XML fragments, DTO assembly, and post-query stitching.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-mybatis-shape">The MyBatis Shape<a href="https://teaql.io/blog/teaql-vs-mybatis-order-page-example#the-mybatis-shape" class="hash-link" aria-label="Direct link to The MyBatis Shape" title="Direct link to The MyBatis Shape">​</a></h2>
<p>A MyBatis implementation might involve:</p>
<ul>
<li>one SQL query for the order list;</li>
<li>one query or join for customer fields;</li>
<li>one query for line item previews;</li>
<li>one query for counts;</li>
<li>one query for grouped status statistics;</li>
<li>result maps or manual DTO mapping;</li>
<li>service code to assemble the final response.</li>
</ul>
<p>That is explicit and controllable, but the business intent is spread across files.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-teaql-shape">The TeaQL Shape<a href="https://teaql.io/blog/teaql-vs-mybatis-order-page-example#the-teaql-shape" class="hash-link" aria-label="Direct link to The TeaQL Shape" title="Direct link to The TeaQL Shape">​</a></h2>
<p>TeaQL tries to express the page as one generated business request:</p>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">User userOrderInfo = Q.users()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    .comment("Query users").purpose("Load data").filterWithId(userId)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    .countOrder()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    .facetByOrderStatus("statusWithCount", Q.orderStatus().countOrders())</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    .selectOrderList(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        Q.ordersWithId()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            .selectOrderId()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            .selectDate()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            .offset(0, 10)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            .selectLineItemList(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                Q.lineItemsWithId().selectImageURL().limit(3)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            )</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            .countLineItems()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    )</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    .execute(context);</span><br></span></code></pre></div></div>
<p>The API is still explicit, but the explicitness is at the business level:</p>
<ul>
<li>user;</li>
<li>orders;</li>
<li>status counts;</li>
<li>order list;</li>
<li>line items;</li>
<li>pagination;</li>
<li>line item count.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-teaql-reduces">What TeaQL Reduces<a href="https://teaql.io/blog/teaql-vs-mybatis-order-page-example#what-teaql-reduces" class="hash-link" aria-label="Direct link to What TeaQL Reduces" title="Direct link to What TeaQL Reduces">​</a></h2>
<p>TeaQL does not eliminate thinking. It reduces repetitive plumbing:</p>
<ul>
<li>mapper XML;</li>
<li>duplicated DTO assembly;</li>
<li>repeated relation-loading code;</li>
<li>repeated count/statistics query fragments;</li>
<li>stringly-typed field references;</li>
<li>one-off page query services.</li>
</ul>
<p>The generated model becomes the shared vocabulary.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="where-mybatis-still-wins">Where MyBatis Still Wins<a href="https://teaql.io/blog/teaql-vs-mybatis-order-page-example#where-mybatis-still-wins" class="hash-link" aria-label="Direct link to Where MyBatis Still Wins" title="Direct link to Where MyBatis Still Wins">​</a></h2>
<p>MyBatis remains a good choice when:</p>
<ul>
<li>a query must be hand-tuned;</li>
<li>SQL is the clearest expression of the business requirement;</li>
<li>the domain model is small;</li>
<li>teams need exact control over vendor-specific SQL;</li>
<li>generated APIs would add weight without reducing repetition.</li>
</ul>
<p>TeaQL and MyBatis do not need to be ideological opposites. TeaQL is valuable when the business model is large enough that generated APIs reduce repeated work.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-review-difference">The Review Difference<a href="https://teaql.io/blog/teaql-vs-mybatis-order-page-example#the-review-difference" class="hash-link" aria-label="Direct link to The Review Difference" title="Direct link to The Review Difference">​</a></h2>
<p>In a TeaQL code review, the reviewer can ask:</p>
<ul>
<li>does this page select the correct relations?</li>
<li>are the counts grouped correctly?</li>
<li>is pagination applied at the right level?</li>
<li>does the runtime context apply tenant and permission policy?</li>
</ul>
<p>That is a higher-level review than checking XML fragments and DTO stitching.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-short-version">The Short Version<a href="https://teaql.io/blog/teaql-vs-mybatis-order-page-example#the-short-version" class="hash-link" aria-label="Direct link to The Short Version" title="Direct link to The Short Version">​</a></h2>
<p>MyBatis gives direct SQL control. TeaQL gives generated business APIs.</p>
<p>For complex business pages, TeaQL keeps page intent closer to the domain model.</p>]]></content:encoded>
            <category>java</category>
            <category>mybatis</category>
            <category>teaql</category>
            <category>query</category>
            <category>enterprise</category>
        </item>
        <item>
            <title><![CDATA[What is TeaQL?]]></title>
            <link>https://teaql.io/blog/what-is-teaql</link>
            <guid>https://teaql.io/blog/what-is-teaql</guid>
            <pubDate>Thu, 14 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[TeaQL is a generated business API platform for AI-native software, proven in Java and rebuilt in Rust for multi-database runtime targets.]]></description>
            <content:encoded><![CDATA[<p>TeaQL is a generated business API platform for systems where the domain model is more important than the storage plumbing around it.</p>
<p>Instead of asking developers to repeatedly write repositories, SQL fragments, DTO stitching, relation loading code, and validation glue, TeaQL starts from a domain model and generates APIs that read like business intent.</p>
<p>The current positioning is simple:</p>
<blockquote>
<p>Generated Business APIs. Java-proven. Rust-powered. Multi-database ready.</p>
</blockquote>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-core-idea">The Core Idea<a href="https://teaql.io/blog/what-is-teaql#the-core-idea" class="hash-link" aria-label="Direct link to The Core Idea" title="Direct link to The Core Idea">​</a></h2>
<p>TeaQL separates the business API from the runtime provider.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Domain Model</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  -&gt; TeaQL Generator</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  -&gt; Generated Q API</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  -&gt; Runtime Provider</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">  -&gt; MySQL / PostgreSQL / SQLite / Memory / Edge / Agent</span><br></span></code></pre></div></div>
<p>Application code should talk to generated APIs. Runtime code should decide how those APIs execute against a database, memory repository, embedded store, or service runtime.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-teaql-generates">What TeaQL Generates<a href="https://teaql.io/blog/what-is-teaql#what-teaql-generates" class="hash-link" aria-label="Direct link to What TeaQL Generates" title="Direct link to What TeaQL Generates">​</a></h2>
<p>Depending on the target stack, TeaQL can generate:</p>
<ul>
<li>entity types;</li>
<li>query builders;</li>
<li>safe expression helpers;</li>
<li>relation loading helpers;</li>
<li>checker and behavior skeletons;</li>
<li>graph save entrypoints;</li>
<li>runtime module registration;</li>
<li>agent guidance for generated APIs.</li>
</ul>
<p>In Java, this appears as fluent generated request APIs. In Rust, generated crates expose <code>Q::entities()</code> style query builders over <code>teaql-rs</code>.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="why-it-matters">Why It Matters<a href="https://teaql.io/blog/what-is-teaql#why-it-matters" class="hash-link" aria-label="Direct link to Why It Matters" title="Direct link to Why It Matters">​</a></h2>
<p>Large business systems repeat the same concepts across many screens and services:</p>
<ul>
<li>users and roles;</li>
<li>orders and line items;</li>
<li>customers and accounts;</li>
<li>status counts and dashboards;</li>
<li>parent-child graph saves;</li>
<li>tenant, permission, audit, and localization policies.</li>
</ul>
<p>Without a generated business API layer, those concepts spread across SQL, mapper XML, repositories, service methods, DTOs, validators, and frontend-specific response shaping.</p>
<p>TeaQL keeps the model vocabulary visible in the code path.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="java-and-rust">Java and Rust<a href="https://teaql.io/blog/what-is-teaql#java-and-rust" class="hash-link" aria-label="Direct link to Java and Rust" title="Direct link to Java and Rust">​</a></h2>
<p>Java TeaQL is the mature, proven path for enterprise systems and Spring Boot services.</p>
<p>Rust TeaQL is the runtime direction for generated domain APIs across PostgreSQL, MySQL, SQLite, embedded SQLite, and memory-backed tests.</p>
<p>The two stacks are not identical, and they do not need to be. They share the programming model: generated APIs over a domain model, executed through a runtime boundary.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="a-small-example">A Small Example<a href="https://teaql.io/blog/what-is-teaql#a-small-example" class="hash-link" aria-label="Direct link to A Small Example" title="Direct link to A Small Example">​</a></h2>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">User userOrderInfo = Q.users()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    .comment("Query users").purpose("Load data").filterWithId(userId)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    .countOrder()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    .statsFromOrder("statusWithCount", Q.orders().comment("Query orders").purpose("Load data").count().groupByOrderStatus())</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    .selectOrderList(</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        Q.ordersWithId()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            .selectOrderId()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            .selectDate()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            .offset(0, 10)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            .countLineItems()</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    )</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    .execute(context);</span><br></span></code></pre></div></div>
<p>This is not just a query. It is the shape of a business page expressed through generated APIs.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="teaql-in-one-sentence">TeaQL in One Sentence<a href="https://teaql.io/blog/what-is-teaql#teaql-in-one-sentence" class="hash-link" aria-label="Direct link to TeaQL in One Sentence" title="Direct link to TeaQL in One Sentence">​</a></h2>
<p>TeaQL turns domain models into stable business APIs that humans and AI tools can read, compose, and run across Java, Rust, and multiple database providers.</p>]]></content:encoded>
            <category>teaql</category>
            <category>codegen</category>
            <category>java</category>
            <category>rust</category>
            <category>ai</category>
        </item>
        <item>
            <title><![CDATA[Why AI-generated software needs deterministic business APIs]]></title>
            <link>https://teaql.io/blog/why-ai-generated-software-needs-deterministic-business-apis</link>
            <guid>https://teaql.io/blog/why-ai-generated-software-needs-deterministic-business-apis</guid>
            <pubDate>Thu, 14 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[AI coding tools work better when they compose stable business APIs instead of guessing SQL, relationships, and runtime rules.]]></description>
            <content:encoded><![CDATA[<p>AI coding tools can produce useful application code quickly. The problem is not speed. The problem is boundary control.</p>
<p>If an AI tool has to infer persistence behavior from scattered SQL, repositories, mapper XML, DTOs, and service conventions, it will eventually guess wrong.</p>
<p>TeaQL exists to make that boundary deterministic.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-guessing-problem">The Guessing Problem<a href="https://teaql.io/blog/why-ai-generated-software-needs-deterministic-business-apis#the-guessing-problem" class="hash-link" aria-label="Direct link to The Guessing Problem" title="Direct link to The Guessing Problem">​</a></h2>
<p>When AI writes data-access code directly, it must infer:</p>
<ul>
<li>table names;</li>
<li>column names;</li>
<li>relation cardinality;</li>
<li>tenant filters;</li>
<li>permission rules;</li>
<li>deleted-row semantics;</li>
<li>transaction boundaries;</li>
<li>pagination rules;</li>
<li>response shape;</li>
<li>database dialect differences.</li>
</ul>
<p>Some of these guesses can pass a simple test and still be wrong in production.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-business-api-boundary">The Business API Boundary<a href="https://teaql.io/blog/why-ai-generated-software-needs-deterministic-business-apis#the-business-api-boundary" class="hash-link" aria-label="Direct link to The Business API Boundary" title="Direct link to The Business API Boundary">​</a></h2>
<p>TeaQL generates APIs from the domain model. That means AI code can compose with named business methods instead of inventing storage behavior.</p>
<div class="language-rust codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-rust codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> orders </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token class-name">Q</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">orders</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">select_customer_with</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Q</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">customers</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">comment</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Query customers"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">purpose</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Load data"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">select_name</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">select_line_item_list_with</span><span class="token punctuation" style="color:#393A34">(</span><span class="token class-name">Q</span><span class="token punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">line_items</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">comment</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Query line_items"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">purpose</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Load data"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">select_sku</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">which_statuses_are</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"PAID"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">page</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">20</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">comment</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Query orders"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">purpose</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Load data"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">execute_for_list</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain">ctx</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token keyword" style="color:#00009f">await</span><span class="token operator" style="color:#393A34">?</span><span class="token punctuation" style="color:#393A34">;</span><br></span></code></pre></div></div>
<p>The model controls what fields and relations exist. The runtime controls how the query executes. The AI composes within those boundaries.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="deterministic-does-not-mean-rigid">Deterministic Does Not Mean Rigid<a href="https://teaql.io/blog/why-ai-generated-software-needs-deterministic-business-apis#deterministic-does-not-mean-rigid" class="hash-link" aria-label="Direct link to Deterministic Does Not Mean Rigid" title="Direct link to Deterministic Does Not Mean Rigid">​</a></h2>
<p>A deterministic API can still be expressive:</p>
<ul>
<li>filters can be combined;</li>
<li>relation loads can be nested;</li>
<li>aggregates can be grouped;</li>
<li>graph writes can save parent and child objects together;</li>
<li>provider-specific behavior can be selected below the API.</li>
</ul>
<p>The point is that the API surface is stable and reviewable.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="better-prompts">Better Prompts<a href="https://teaql.io/blog/why-ai-generated-software-needs-deterministic-business-apis#better-prompts" class="hash-link" aria-label="Direct link to Better Prompts" title="Direct link to Better Prompts">​</a></h2>
<p>TeaQL also makes prompts smaller.</p>
<p>Instead of giving an AI tool the entire schema, SQL examples, repository conventions, and DTO rules, a team can provide a generated API guide:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">Use TeaQL Q APIs for reads.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Use generated relation selectors.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Execute through UserContext.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Do not write raw SQL unless explicitly requested.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Use graph save for parent-child persistence.</span><br></span></code></pre></div></div>
<p>That is a stronger contract than a long explanation of database structure.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="runtime-safety">Runtime Safety<a href="https://teaql.io/blog/why-ai-generated-software-needs-deterministic-business-apis#runtime-safety" class="hash-link" aria-label="Direct link to Runtime Safety" title="Direct link to Runtime Safety">​</a></h2>
<p>The generated API is only half the story. Runtime boundaries matter too.</p>
<p>TeaQL keeps execution behind context and provider layers:</p>
<ul>
<li>Java uses <code>UserContext</code> as the runtime boundary.</li>
<li>Rust uses <code>teaql_runtime::UserContext</code>, repository registries, behavior hooks, and provider registration.</li>
<li>Database providers execute against PostgreSQL, MySQL, SQLite, rusqlite, or memory.</li>
</ul>
<p>AI-generated application code should not own those decisions.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="the-short-version">The Short Version<a href="https://teaql.io/blog/why-ai-generated-software-needs-deterministic-business-apis#the-short-version" class="hash-link" aria-label="Direct link to The Short Version" title="Direct link to The Short Version">​</a></h2>
<p>AI tools are fast at composition. They are unreliable at reconstructing business rules from infrastructure code.</p>
<p>TeaQL gives them deterministic business APIs to compose.</p>]]></content:encoded>
            <category>ai</category>
            <category>api</category>
            <category>teaql</category>
            <category>codegen</category>
            <category>architecture</category>
        </item>
    </channel>
</rss>