<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>HanLHo. - Fractional Architect &amp; Software Product Engineer - acceptance-testing</title>
    <link rel="self" type="application/atom+xml" href="https://hanlho.com/tags/acceptance-testing/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://hanlho.com"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-07-13T00:00:00+00:00</updated>
    <id>https://hanlho.com/tags/acceptance-testing/atom.xml</id>
    <entry xml:lang="en">
        <title>On Fluent Acceptance-Testing DSLs</title>
        <published>2026-07-13T00:00:00+00:00</published>
        <updated>2026-07-13T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Unknown
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://hanlho.com/p/on-fluent-acceptance-testing-dsls/"/>
        <id>https://hanlho.com/p/on-fluent-acceptance-testing-dsls/</id>
        
        <content type="html" xml:base="https://hanlho.com/p/on-fluent-acceptance-testing-dsls/">&lt;p&gt;I just completed &lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;hanlho&#x2F;skills-primer&quot;&gt;a small CLI tool&lt;&#x2F;a&gt; in which I used a testing style, &#x27;fluent acceptance-testing Domain Specific Languages (DSLs)&#x27;, heavily, with good results. They are custom test specifications that read close to natural language, test behaviour rather than implementation, and survive refactoring because they are intended to be run against stable interfaces.&lt;&#x2F;p&gt;
&lt;aside class=&quot;sidebar-note sidebar-note-right&quot;&gt;
  &lt;p&gt;On terminology used in this post: I use coding &#x27;agent&#x27;, instead of &#x27;harness&#x27;, to refer to CLI tools like Codex, Claude Code or Pi.&lt;&#x2F;p&gt;

&lt;&#x2F;aside&gt;
&lt;p&gt;Last year I started a seven-part blog post series on this approach. I bit off more than I could chew, the summer holidays started, and it never happened. Instead of finishing that series, I&#x27;ll condense what I wrote then and point you to &lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;hanlho&#x2F;agentfiles&#x2F;src&#x2F;branch&#x2F;main&#x2F;agents&#x2F;dotagents&#x2F;.agents&#x2F;skills&#x2F;designing-fluent-acceptance-dsl&#x2F;SKILL.md&quot;&gt;a reference&lt;&#x2F;a&gt; and &lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;hanlho&#x2F;skills-primer&#x2F;tests&#x2F;&quot;&gt;a full test suite in this style&lt;&#x2F;a&gt; rather than motivating everything in detail. I think this will work too.&lt;&#x2F;p&gt;
&lt;p&gt;At their heart, &#x27;fluent acceptance-testing DSLs&#x27; are always custom, meaning all naming can be tailored to project requirements and the domain language, but they must follow a specific codified pattern: setup, action, assertion.&lt;&#x2F;p&gt;
&lt;p&gt;Below is an example for a command line utility. At a high level, each specification or test consists of three parts:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Setup:&lt;&#x2F;strong&gt; configure state, input, and environment. Example: &lt;code&gt;Cmd::given()...&lt;&#x2F;code&gt;. &lt;code&gt;Cmd&lt;&#x2F;code&gt; because we are testing a command line utility, in this project I chose &lt;code&gt;given()&lt;&#x2F;code&gt; to initiate the setup phase. What follows are the setup steps without distracting technical infrastructure.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Action:&lt;&#x2F;strong&gt; execute the operation under test. Example: &lt;code&gt;when_run()&lt;&#x2F;code&gt;. CLI commands are often &lt;em&gt;run&lt;&#x2F;em&gt;. This is when the actual underlying command gets executed.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Assertion:&lt;&#x2F;strong&gt; verify behaviour and diagnostics. Example: &lt;code&gt;.expect_...().expect_...()....&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;After each transition to a new part, typically a new struct&#x2F;object is returned that only has the relevant methods for the next part. For example, the method that runs the action (in this case a CLI command) returns a new structure with methods that verify expectations. Note: there can be any number of &#x27;parts&#x27; aside these three main ones but the 3 mentioned are standard.&lt;&#x2F;p&gt;
&lt;p&gt;An example probably makes this clearer:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#eff1f5;color:#4f5b66;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;test&lt;&#x2F;span&gt;&lt;span&gt;]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#8fa1b3;&quot;&gt;prime_should_discover_skills_from_default_path&lt;&#x2F;span&gt;&lt;span&gt;() {
&lt;&#x2F;span&gt;&lt;span&gt;    Cmd::given()
&lt;&#x2F;span&gt;&lt;span&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;command_prime&lt;&#x2F;span&gt;&lt;span&gt;()
&lt;&#x2F;span&gt;&lt;span&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;with_skill&lt;&#x2F;span&gt;&lt;span&gt;(
&lt;&#x2F;span&gt;&lt;span&gt;            &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;example-skill&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span&gt;            &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;Use when testing example scenarios.&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span&gt;            &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;# Example Skill&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;Do the thing.&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span&gt;        )
&lt;&#x2F;span&gt;&lt;span&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;when_run&lt;&#x2F;span&gt;&lt;span&gt;()
&lt;&#x2F;span&gt;&lt;span&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;should_succeed&lt;&#x2F;span&gt;&lt;span&gt;()
&lt;&#x2F;span&gt;&lt;span&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;expect_prime_instructions&lt;&#x2F;span&gt;&lt;span&gt;()
&lt;&#x2F;span&gt;&lt;span&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;expect_available_skills&lt;&#x2F;span&gt;&lt;span&gt;()
&lt;&#x2F;span&gt;&lt;span&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;expect_skill&lt;&#x2F;span&gt;&lt;span&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;example-skill&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;, &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;Use when testing example scenarios&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;);
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;test&lt;&#x2F;span&gt;&lt;span&gt;]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#8fa1b3;&quot;&gt;prime_should_not_discover_skills_when_default_path_empty&lt;&#x2F;span&gt;&lt;span&gt;() {
&lt;&#x2F;span&gt;&lt;span&gt;    Cmd::given()
&lt;&#x2F;span&gt;&lt;span&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;command_prime&lt;&#x2F;span&gt;&lt;span&gt;()
&lt;&#x2F;span&gt;&lt;span&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;when_run&lt;&#x2F;span&gt;&lt;span&gt;()
&lt;&#x2F;span&gt;&lt;span&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;should_succeed&lt;&#x2F;span&gt;&lt;span&gt;()
&lt;&#x2F;span&gt;&lt;span&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;expect_prime_instructions&lt;&#x2F;span&gt;&lt;span&gt;()
&lt;&#x2F;span&gt;&lt;span&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;expect_no_skills_detected&lt;&#x2F;span&gt;&lt;span&gt;()
&lt;&#x2F;span&gt;&lt;span&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;expect_out_does_not_contain&lt;&#x2F;span&gt;&lt;span&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;&amp;lt;skill&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;);
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The full test suite and its infrastructure are available &lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;hanlho&#x2F;skills-primer&#x2F;src&#x2F;commit&#x2F;f5b6ca8d2d6572e97cf51f2dc58524bf9b9963a6&#x2F;tests&#x2F;prime.rs&quot;&gt;here&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;This pattern is applicable to any kind of test and any type of executable. Although not strictly necessary, you should test against a stable contract, preferably from a usability point of view. In these cases you can apply this style to unit tests as well. If starting a CLI (or webserver or any other kind of &#x27;container&#x27; or service) becomes too much overhead, there is usually a contract at a lower level in the code you can test against.&lt;&#x2F;p&gt;
&lt;p&gt;This style is very flexible, which allows for expressive, readable, and consistent executable test descriptions, more so than other custom styles I have seen. For example, in the above we might have chosen differently:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Cmd::given()&lt;&#x2F;code&gt;: could have been &lt;code&gt;SkillsPrimer::prime().with_skill_on_disk(...)&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;should_succeed().expect_*&lt;&#x2F;code&gt;: &lt;code&gt;should_succeed()&lt;&#x2F;code&gt; is also an expectation but this reads more fluently and it allows for the DSL to be more constrained on success and failure checks.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;expect_prime_instructions().expect_available_skills()&lt;&#x2F;code&gt;: could have been &lt;code&gt;expect().prime_instructions().available_skills()&lt;&#x2F;code&gt;. The &lt;code&gt;expect()&lt;&#x2F;code&gt; method could then return a struct with a more limited set of methods, allowing for better scoping and deferred execution (which enables reporting of multiple failures in a test instead of only the first one).&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The full mechanics I have encoded in a skill which is the reference for more details: &lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;hanlho&#x2F;agentfiles&#x2F;src&#x2F;branch&#x2F;main&#x2F;agents&#x2F;dotagents&#x2F;.agents&#x2F;skills&#x2F;designing-fluent-acceptance-dsl&#x2F;SKILL.md&quot;&gt;Designing Fluent Acceptance-Test DSLs&lt;&#x2F;a&gt;. This skill is my reference I keep updating with new findings and, incidentally, is also how I instruct coding agents on how to write these kinds of tests.&lt;&#x2F;p&gt;
&lt;aside class=&quot;sidebar-note sidebar-note-right&quot;&gt;
  &lt;p&gt;With coding agents this style is becoming even more important because &lt;strong&gt;Fluent Acceptance-Test DSLs serve as &lt;strong&gt;executable&lt;&#x2F;strong&gt; specifications a coding agent or LLM can work against.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Coding agents work better if you give them something they can verify their work against. With these kinds of DSLs we can describe functionality in a way they can verify against. Also, since these tests are well-structured, coding agents can work with them and add more tests easily.&lt;&#x2F;p&gt;

&lt;&#x2F;aside&gt;
&lt;p&gt;Here is what I consider the main characteristics and benefits of these tests:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Behaviour-focused:&lt;&#x2F;strong&gt; tests describe expected behaviour, not implementation mechanics. They serve as executable specifications!&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Decoupled from code structure:&lt;&#x2F;strong&gt; tests run against stable, public interfaces (CLI, HTTP, key internal interfaces) so large and small refactorings don&#x27;t break them!&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Fluent, chainable DSL:&lt;&#x2F;strong&gt; custom methods form a readable chain (.given() &#x2F; .when() &#x2F; .then() or similar), written in the application&#x27;s own language.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Multi-level:&lt;&#x2F;strong&gt; the same approach works at application level (HTTP, CLI) and unit level. Strategic unit tests target specific, stable interfaces when that is more effective.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Custom, no external framework:&lt;&#x2F;strong&gt; the DSL is your own code with basic assertions. No Cucumber step definitions or heavyweight BDD frameworks.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Evolvable:&lt;&#x2F;strong&gt; start simple, refine as needs grow. The DSL can be refactored to match the domain more closely over time.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Consistent:&lt;&#x2F;strong&gt; reusable assertions, expectations, fixtures, and builders across the test suite.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Discoverable:&lt;&#x2F;strong&gt; IDE autocomplete (cmd-space) shows available steps and assertions, guiding the test writer. Click through a DSL method to see exactly which API calls or assertions are made.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The trade-offs:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Error localisation:&lt;&#x2F;strong&gt; when a test fails, the abstraction means you may need to drill deeper to find the cause (you trade error localisation for refactorability).&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Code coverage concerns:&lt;&#x2F;strong&gt; more code is exercised per test, making coverage less targeted at specific lines. (Which may be a good thing too.)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Customisable:&lt;&#x2F;strong&gt; a double-edged sword; flexible but depends on team skill and discipline. No imposed structure like Cucumber provides.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;I consider it a benefit that these DSLs are pure code, but I am not sure this is for every team or role. In some of my projects I end up with twice as much test code as production code.&lt;&#x2F;p&gt;
&lt;p&gt;To conclude, I will show another example from the same project which required a different DSL. As a short background on this project, which is not the focus of this post but merely serves as an illustration example: the project is aimed at coding agents that do not support skills. To that end, it provides a &lt;code&gt;prime&lt;&#x2F;code&gt; command that primes a coding agent to support skills. Below is an example of an end-to-end test suite that can run actual prompts with a real agent that does not have skill detection built-in.&lt;&#x2F;p&gt;
&lt;p&gt;Note:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;AgentWithoutSkills&lt;&#x2F;code&gt;. We start with an agent that does not support skills out of the box. (The actual agent is hidden from the test. Under the hood, this is Zerostack but can be any agent that does not support skills.)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;unprimed()&lt;&#x2F;code&gt; and &lt;code&gt;primed()&lt;&#x2F;code&gt;. The main difference between the tests, the first test runs the agent without skills support and verifies skills are indeed not loaded. The second test &lt;em&gt;primes&lt;&#x2F;em&gt; this agent and verifies skills &lt;em&gt;are&lt;&#x2F;em&gt; loaded.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre data-lang=&quot;rust&quot; style=&quot;background-color:#eff1f5;color:#4f5b66;&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;&lt;span&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;test&lt;&#x2F;span&gt;&lt;span&gt;]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#8fa1b3;&quot;&gt;unprimed_agent_without_skills_should_not_find_skills&lt;&#x2F;span&gt;&lt;span&gt;() {
&lt;&#x2F;span&gt;&lt;span&gt;    AgentWithoutSkills::unprimed()
&lt;&#x2F;span&gt;&lt;span&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;when_run_with&lt;&#x2F;span&gt;&lt;span&gt;(
&lt;&#x2F;span&gt;&lt;span&gt;            &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;Reply exactly with SKILL_NOT_FOUND if you cannot find or load a skill named test-skill. Reply exactly with TEST_SKILL_LOADED only if you actually load that skill.&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;,
&lt;&#x2F;span&gt;&lt;span&gt;        )
&lt;&#x2F;span&gt;&lt;span&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;should_succeed&lt;&#x2F;span&gt;&lt;span&gt;()
&lt;&#x2F;span&gt;&lt;span&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;expect_output&lt;&#x2F;span&gt;&lt;span&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;SKILL_NOT_FOUND&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;expect_output_not_contain&lt;&#x2F;span&gt;&lt;span&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;TEST_SKILL_LOADED&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;);
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;rstest&lt;&#x2F;span&gt;&lt;span&gt;]
&lt;&#x2F;span&gt;&lt;span&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;case&lt;&#x2F;span&gt;&lt;span&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;load_with_name&lt;&#x2F;span&gt;&lt;span&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;Load test-skill&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;)]
&lt;&#x2F;span&gt;&lt;span&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;case&lt;&#x2F;span&gt;&lt;span&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;invoke_with_name&lt;&#x2F;span&gt;&lt;span&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;Invoke test-skill&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;)]
&lt;&#x2F;span&gt;&lt;span&gt;#[&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;case&lt;&#x2F;span&gt;&lt;span&gt;::&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;use_with_name&lt;&#x2F;span&gt;&lt;span&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;Use test-skill&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;)]
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;fn &lt;&#x2F;span&gt;&lt;span style=&quot;color:#8fa1b3;&quot;&gt;primed_agent_without_skills_should_find_skills&lt;&#x2F;span&gt;&lt;span&gt;(#[case] &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;prompt&lt;&#x2F;span&gt;&lt;span&gt;: &amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;str&lt;&#x2F;span&gt;&lt;span&gt;) {
&lt;&#x2F;span&gt;&lt;span&gt;    AgentWithoutSkills::primed()
&lt;&#x2F;span&gt;&lt;span&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;with_skills_from&lt;&#x2F;span&gt;&lt;span&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;tests&#x2F;fixtures&#x2F;&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;)
&lt;&#x2F;span&gt;&lt;span&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;when_run_with&lt;&#x2F;span&gt;&lt;span&gt;(prompt)
&lt;&#x2F;span&gt;&lt;span&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;should_succeed&lt;&#x2F;span&gt;&lt;span&gt;()
&lt;&#x2F;span&gt;&lt;span&gt;        .&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;expect_output&lt;&#x2F;span&gt;&lt;span&gt;(&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;TEST_SKILL_LOADED&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;);
&lt;&#x2F;span&gt;&lt;span&gt;}
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The full source code for this end-to-end test and its infrastructure for the DSL is &lt;a href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;hanlho&#x2F;skills-primer&#x2F;src&#x2F;commit&#x2F;f5b6ca8d2d6572e97cf51f2dc58524bf9b9963a6&#x2F;tests&#x2F;end_to_end.rs&quot;&gt;here&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;I hope most of this is clear. Please do not hesitate to reach out if you want to know more, would like me to help you set this up, or work together on fleshing this out more (really!). I am curious to know if this resonates with others in the field.&lt;&#x2F;p&gt;
</content>
        
    </entry>
</feed>
