<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Yurii Baranov</title>
    <description>The latest articles on DEV Community by Yurii Baranov (@yb_combi).</description>
    <link>https://dev.to/yb_combi</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4111255%2Fd455d701-077f-4d2c-b718-a0407375bf00.jpg</url>
      <title>DEV Community: Yurii Baranov</title>
      <link>https://dev.to/yb_combi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yb_combi"/>
    <language>en</language>
    <item>
      <title>Find the Vulnerability Hiding Between the Features</title>
      <dc:creator>Yurii Baranov</dc:creator>
      <pubDate>Wed, 28 Oct 2026 05:30:56 +0000</pubDate>
      <link>https://dev.to/yb_combi/find-the-vulnerability-hiding-between-the-features-23jk</link>
      <guid>https://dev.to/yb_combi/find-the-vulnerability-hiding-between-the-features-23jk</guid>
      <description>&lt;p&gt;&lt;em&gt;Security Scenario Explorer — a proposed security-testing direction built on Combinatorics Framework JVM.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Most security tools look for known weaknesses. But some vulnerabilities appear when individually valid requests interact in an unexpected order.&lt;/p&gt;

&lt;p&gt;A permission changes while a session remains active. A retry arrives after a timeout. A webhook is delivered twice. An AI agent reads untrusted content while holding access to a privileged tool. Each operation may look legitimate in isolation; the sequence may still violate a security boundary.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security Scenario Explorer&lt;/strong&gt; is a proposed workbench for investigating these interaction-driven failures systematically. It builds on Combinatorics Framework JVM, a scenario-modeling and execution framework developed by Yurii B.&lt;/p&gt;

&lt;p&gt;It is not positioned as a replacement for vulnerability scanners, DAST, or fuzzers. Its intended focus is security behavior that depends on combinations of context, state, action order, and exceptional events, therefore - reassures you even more in considered direction of potential risks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why investigate combinations?
&lt;/h2&gt;

&lt;p&gt;Broken access control remains the top category in the &lt;a href="https://top10.owasp.org/2025/" rel="noopener noreferrer"&gt;OWASP Top 10:2025&lt;/a&gt;, which also includes security misconfiguration, authentication failures, insecure design, and mishandling of exceptional conditions. The &lt;a href="https://owasp.org/API-Security/editions/2023/en/0x11-t10/" rel="noopener noreferrer"&gt;OWASP API Security Top 10&lt;/a&gt; highlights broken object-level authorization. For AI applications, the &lt;a href="https://genai.owasp.org/llm-top-10/" rel="noopener noreferrer"&gt;OWASP Top 10 for LLM Applications:2025&lt;/a&gt; includes prompt injection and excessive agency.&lt;/p&gt;

&lt;p&gt;These risks often require more than a single request to investigate. The relevant question is not only “Does this endpoint reject a bad input?” but also “Does the system preserve its security rules after this sequence of valid actions and unexpected events?”&lt;/p&gt;

&lt;h2&gt;
  
  
  Model the security question
&lt;/h2&gt;

&lt;p&gt;Instead of starting only from a list of known vulnerability patterns, describe what can vary, what must remain true, and how much execution is acceptable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Context:&lt;/strong&gt; identities, roles, scopes, tenants, sessions, resource ownership, and configuration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Action sequences:&lt;/strong&gt; authenticate, create, read, share, grant, revoke, retry, and repeat—in the allowed orders.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unexpected events:&lt;/strong&gt; expired credentials, duplicate requests, interrupted workflows, and repeated webhook delivery at defined points in a sequence.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security invariants:&lt;/strong&gt; rules that must hold across every tested combination and ordering.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The framework plans the experiment before execution, reports candidate counts, and supports budgeted &lt;em&gt;t&lt;/em&gt;-way selection using a greedy strategy; it does not claim to find a mathematically minimal test set. Candidates run through configured adapters. Verdicts distinguish application failures from harness or infrastructure problems, and failure triage can reduce a failing case to a small reproducer for verification and regression testing.&lt;/p&gt;

&lt;h2&gt;
  
  
  What could it investigate?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Authorization and tenant isolation.&lt;/strong&gt; Can a user access another tenant’s resource after a role change, or does a stale session retain a capability that should have been revoked?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Authentication and session lifecycle.&lt;/strong&gt; What happens when credentials expire or are revoked in the middle of a workflow?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Business-logic abuse.&lt;/strong&gt; Can retries, replays, duplicate transactions, or unusual action ordering violate a financial or data-access invariant?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configuration interactions.&lt;/strong&gt; Can a combination of settings or feature flags make a restricted operation reachable?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI-agent boundaries.&lt;/strong&gt; Can untrusted content influence an agent to use a tool beyond its granted permissions or bypass an approval requirement?&lt;/p&gt;

&lt;h2&gt;
  
  
  Evidence, not labels
&lt;/h2&gt;

&lt;p&gt;An AI assistant can help formulate threat hypotheses, build scenario models, interpret results, and suggest follow-up experiments. The human remains responsible for the authorized scope, the security properties being tested, and approval of consequential actions.&lt;/p&gt;

&lt;p&gt;A finding should not be accepted because a tool or model calls it a vulnerability. It should be supported by a clearly stated invariant, an observed violation, and a reproducible test. Before trusting a security oracle, calibrate it with a known test defect and confirm that the test can detect the failure it is supposed to detect.&lt;/p&gt;

&lt;h2&gt;
  
  
  Current status and limitations
&lt;/h2&gt;

&lt;p&gt;The underlying Combinatorics Framework JVM already supports context, sequence, and event modeling; constraints; plan and candidate counts; budgeted candidate selection; execution through configured adapters; verdict classification; failure-witness triage; checkpoints; and an AI-operator workflow with approval gates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The security-specific layer is still planned, not demonstrated.&lt;/strong&gt; That includes reusable security oracles, a scope guard, operating-system-level isolation, a concurrent-dispatch adapter, and ready-made scenario packs beginning with API authorization. Defined event injection covers chosen points in a sequence; it does not by itself test two requests arriving at precisely the same time.&lt;/p&gt;

&lt;p&gt;There is also an important safety limitation today: generated Java runs inside the JVM without an operating-system sandbox. A security edition needs explicit scope declarations and target allow-lists, execution limits, timeouts, secret redaction, auditable run records, and isolation for generated code before it can be presented as safe for broader security-testing use.&lt;/p&gt;

&lt;h2&gt;
  
  
  The first proof
&lt;/h2&gt;

&lt;p&gt;The first milestone should be a reproducible authorization or business-logic flaw that a single-request test misses. Publish the scenario, the invariant it violates, the observed result, and a minimal reproducer - then rerun it as a regression test.&lt;/p&gt;

&lt;p&gt;The goal is not to claim that every attack can be enumerated. It is to make a defined security investigation more systematic, bounded, repeatable, and re-viewable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Model what must remain secure. Explore the interactions that could break it. Preserve the evidence.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Security Scenario Explorer is a proposed direction, built on &lt;a href="https://github.com/ghYura/Combinatorics-Framework-JVM" rel="noopener noreferrer"&gt;Combinatorics Framework JVM&lt;/a&gt;. If you work in AppSec, penetration testing, or security-minded QA, share a real cross-feature failure pattern that would benefit from a reproducible scenario model.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Combinatorics Framework - re-assuring safety behavior more, saving QA jobs as a test-space scenario designer-architect/supervising AI&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>appsec</category>
      <category>testing</category>
      <category>automation</category>
    </item>
    <item>
      <title>Design full test-space scenarios at once and delegate precised evidence-based exploratory testing to your AI</title>
      <dc:creator>Yurii Baranov</dc:creator>
      <pubDate>Mon, 26 Oct 2026 03:56:43 +0000</pubDate>
      <link>https://dev.to/yb_combi/design-full-test-space-scenarios-at-once-and-delegate-precised-evidence-based-exploratory-testing-3o59</link>
      <guid>https://dev.to/yb_combi/design-full-test-space-scenarios-at-once-and-delegate-precised-evidence-based-exploratory-testing-3o59</guid>
      <description>&lt;h2&gt;
  
  
  You Can’t List Your Unknown Bugs, but You Can Model What Varies.
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Combinatorics-Framework-JVM turns a model of settings, action histories and optional events into planned test cases, and keeps the experiment inspectable from design through evidence.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;⚡️ &lt;strong&gt;Straight to the point&lt;/strong&gt; for most impatient/busy-reader who respects human's work (let your AI read 'AI_DELEGATION.md' after dowloading the release, and it will answer you live): &lt;a href="https://github.com/ghYura/Combinatorics-Framework-JVM/releases" rel="noopener noreferrer"&gt;Combinatorics-Framework-JVM&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;“What kinds of bugs does my system under test have?”&lt;/p&gt;

&lt;p&gt;It sounds like the obvious first question for any testing tool. It’s also the wrong one. If you could answer it, you’d already have the tests.&lt;/p&gt;

&lt;p&gt;The defects that hurt are the ones nobody knew to name: a guest, a coupon and a repeated payment request, each fine alone and wrong together. AI coding assistants sharpen the problem. An assistant can implement the feature, generate the unit tests and explain why the code should work. It can’t tell you which &lt;em&gt;interactions&lt;/em&gt; those tests exercised.&lt;/p&gt;

&lt;p&gt;So don’t start from bugs. Start from three questions you &lt;em&gt;can&lt;/em&gt; answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What varies?&lt;/strong&gt; Settings, inputs, the order of actions, events that may or may not happen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What must stay true?&lt;/strong&gt; An invariant, such as “the same payment request creates at most one charge.”&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How much am I willing to run?&lt;/strong&gt; A bounded budget of cases you can actually inspect.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bugs aren’t the input to that exercise. They’re the output.&lt;/p&gt;

&lt;h2&gt;
  
  
  Investigation, not diagnosis
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Combinatorics-Framework-JVM&lt;/strong&gt; is built for exactly that kind of investigational testing: a Java workbench with a desktop app (guif), a command line and an embedding API. You describe the variations, it generates test candidates, runs them through your configured runners and helps you examine the results. State a model, run a bounded experiment, read the evidence, refine the model, repeat.&lt;/p&gt;

&lt;p&gt;It won’t discover unknown defects for you. It turns a test idea into a visible model, a bounded run and results another engineer can inspect.&lt;/p&gt;

&lt;h2&gt;
  
  
  Model the context, and the history
&lt;/h2&gt;

&lt;p&gt;Take a small checkout:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What varies&lt;/th&gt;
&lt;th&gt;Choices&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Customer&lt;/td&gt;
&lt;td&gt;Guest, registered&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Payment method&lt;/td&gt;
&lt;td&gt;Card, wallet, cash on delivery&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Channel&lt;/td&gt;
&lt;td&gt;Website, API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pricing policy&lt;/td&gt;
&lt;td&gt;Current price, price captured earlier&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That’s 24 static combinations. Run them all. Now add history: submit, time out, retry, a price change at different moments. The input values barely changed. The &lt;em&gt;history&lt;/em&gt; did, and no parameter table shows it.&lt;/p&gt;

&lt;p&gt;So the Framework models three kinds of variation separately:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Static context:&lt;/strong&gt; account type, payment method, feature flags. Covering selection can reduce this part to a declared interaction strength.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Action sequences:&lt;/strong&gt; what happens first, next and again, including order and repetition.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sudden or optional events:&lt;/strong&gt; a timeout, a duplicate request, a price change, including &lt;em&gt;when&lt;/em&gt; it strikes and the case where it never does.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sequences and sudden events are then crossed with every selected context, not squeezed into the same matrix. That stops you from flattening everything into interchangeable parameters and assuming you tested the histories that matter. For a workflow bug, the timeline deserves more attention than a big parameter matrix.&lt;/p&gt;

&lt;p&gt;Constraints need the same care. An impossible combination can be excluded. A valid input the application should reject (cash on delivery over the API, say) deserves a negative test, not a deletion. The modeler decides which question a test answers. The generator can’t.&lt;/p&gt;

&lt;h2&gt;
  
  
  A model you can read in one minute
&lt;/h2&gt;

&lt;p&gt;Two modes, three actions. Every candidate gets one mode and two different actions in a chosen order (AB, BA, AC, CA, BC, CB): 2 × 6 = 12 candidates. Save this as &lt;code&gt;first-scenario.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"spec_version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Two modes and ordered pairs of actions"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"slots"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"sheet"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MODE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"alias"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"choose_one"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"raw"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"values"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"safe"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"fast"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"sheet"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"OPS"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"alias"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"permute(2)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"flags"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"FW_Concatenator="&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"raw"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"values"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"A"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"B"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"C"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And these settings as &lt;code&gt;first-scenario.properties&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="py"&gt;cf.coverage.strength&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;
&lt;span class="py"&gt;cf.coverage.budget&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;
&lt;span class="py"&gt;cf.plan.autoPromoteSingleVerb&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, with JDK 25 and &lt;code&gt;fw-app.jar&lt;/code&gt; in your working folder:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;java &lt;span class="nt"&gt;-Djava&lt;/span&gt;.awt.headless&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="nt"&gt;-jar&lt;/span&gt; fw-app.jar validate &lt;span class="nt"&gt;--scenario&lt;/span&gt; first-scenario.json &lt;span class="nt"&gt;--config&lt;/span&gt; first-scenario.properties
java &lt;span class="nt"&gt;-Djava&lt;/span&gt;.awt.headless&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="nt"&gt;-jar&lt;/span&gt; fw-app.jar plan &lt;span class="nt"&gt;--scenario&lt;/span&gt; first-scenario.json &lt;span class="nt"&gt;--config&lt;/span&gt; first-scenario.properties
java &lt;span class="nt"&gt;-Djava&lt;/span&gt;.awt.headless&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt; &lt;span class="nt"&gt;-jar&lt;/span&gt; fw-app.jar candidates &lt;span class="nt"&gt;--scenario&lt;/span&gt; first-scenario.json &lt;span class="nt"&gt;--config&lt;/span&gt; first-scenario.properties &lt;span class="nt"&gt;--limit&lt;/span&gt; 12
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Validate, inspect the plan, read the candidates, all before anything runs. These are plain-text candidates for learning the model, not programs to execute.&lt;/p&gt;

&lt;p&gt;Prefer spreadsheets? The classic workbook style (data sheets plus an &lt;code&gt;FW_Seq&lt;/code&gt; control sheet) expresses the same model, and the wizard in guif guides a first scenario.&lt;/p&gt;

&lt;h2&gt;
  
  
  When order is the bug
&lt;/h2&gt;

&lt;p&gt;A basic retry test submits a request twice with the same key and confirms that one order exists. Now change the history: the provider accepts the first request, its response times out, a confirmation arrives while the client is retrying, and the client tries again. Is there still exactly one charge and one order?&lt;/p&gt;

&lt;p&gt;A small timeline model might include these histories:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;History&lt;/th&gt;
&lt;th&gt;Events the harness controls&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;Submit → success → retry the same request&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;td&gt;Submit → timeout → retry → confirmation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;Submit → timeout → confirmation → retry&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D&lt;/td&gt;
&lt;td&gt;Submit → timeout → retry → retry → confirmation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The invariant: &lt;strong&gt;reusing a request key must never create a second charge or a second order.&lt;/strong&gt; Check durable business state (charges, orders, how they relate), not just the final HTTP status.&lt;/p&gt;

&lt;p&gt;One honest boundary: the Framework generates ordered choices, permutations, repetitions and optional events. It doesn’t control a thread scheduler or a remote payment provider. Your adapter has to make those events controllable: hold and release a callback, simulate a timeout, reset state. Once it does, you vary the histories without hand-copying a test method for every combination.&lt;/p&gt;

&lt;h2&gt;
  
  
  A planted defect, caught
&lt;/h2&gt;

&lt;p&gt;(quick self-test)&lt;br&gt;
You don’t have to take this on faith. The project’s manual ships a self-contained checkout demo whose stand-in system has a deliberately planted lost-order defect. &lt;code&gt;validate&lt;/code&gt;, &lt;code&gt;plan&lt;/code&gt; and &lt;code&gt;candidates&lt;/code&gt; report 72 generated cases, 24 removed by one constraint and 48 executable. The full run ends with 44 PASS and 4 DOMAIN_FAIL, with no harness failures. The repo’s &lt;a href="https://github.com/ghYura/Combinatorics-Framework-JVM/blob/main/docs/AI_DELEGATION_TEMPLATE_VALIDATION.md" rel="noopener noreferrer"&gt;validation report&lt;/a&gt; records this on JDK 25 and a 0.1.0-SNAPSHOT build.&lt;/p&gt;

&lt;p&gt;A larger showcase in the manual runs 4,128 generated Cucumber scenarios against an in-JVM checkout engine and 714 browser scenarios (Selenium, headless Firefox) against a dummy web shop, both with planted defects hiding in action order and event timing. A second run of each design gave the same verdict for every case.&lt;/p&gt;

&lt;p&gt;Two things to notice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A run that finds defects still exits with code 0.&lt;/strong&gt; A failure is a result, not a crash, so read the verdicts. Keep product failures (DOMAIN_FAIL) apart from harness outcomes such as BROKEN, TIMEOUT and INFRA_FAIL.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Every defect here was planted.&lt;/strong&gt; That shows the harness can &lt;em&gt;see&lt;/em&gt; a fault, not that it finds ones nobody knows about. It’s why the manual says to calibrate the oracle with a known-failing case before trusting a model. The unknown bugs are what the experiment is for.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What comes back
&lt;/h2&gt;

&lt;p&gt;Failures arrive as cases, not red lights: the candidate, its verdict, its measurements and the context to reproduce it. Checkpoints and exports keep the evidence, and triage groups failures into findings with representative witnesses. The documented “minimal witness” is the failing case with the least source in its group: a good place to start, not a proven mathematical minimum. Values associated with elevated failure rates are leads, not causes.&lt;/p&gt;

&lt;p&gt;When nothing fails, you still get something: “within this model, at this strength, no violation observed.” That isn’t proof of absence. It’s a claim another engineer can inspect, challenge and extend.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you bring, and what it doesn’t promise
&lt;/h2&gt;

&lt;p&gt;The Framework generates and organizes. You make it real. The model and the invariant are yours: it doesn’t discover what must stay true (a far easier question than “what is broken?”, but not a free one). You also bring:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;An adapter&lt;/strong&gt; that connects candidates to your system and controls its state and dependencies.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An oracle:&lt;/strong&gt; assertions that encode the invariant. A generated case without a meaningful check is just activity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A controlled environment&lt;/strong&gt; with a reset strategy, plus the &lt;strong&gt;judgment&lt;/strong&gt; about which failures matter and what went untested.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And be honest about the limits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pairwise isn’t magic.&lt;/strong&gt; It covers pairs of modeled values, not every three-way defect, action order or timing failure, and the selection is greedy, so it never claims a minimum suite. With fewer than three varying factors, every pair is already the whole space and nothing is reduced. Its value is that you can state what you selected and inspect it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One verdict per case.&lt;/strong&gt; The first failing check names the verdict and hides later ones, so report every check as a metric too.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No OS sandbox for Java.&lt;/strong&gt; Java cases run inside the Framework’s own JVM with your permissions, so treat every run as code execution on your machine: use a dedicated workspace and keep production out until the adapter, assertions and side effects are clear. Python cases run as separate processes and can be sandboxed with bwrap or Docker.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The same machinery, for AI experiments
&lt;/h2&gt;

&lt;p&gt;Prompts × retrieval strategies × thresholds is a combinatorial space too. Three retrieval strategies, two prompts and two thresholds make 12 configurations. Evaluate each on 50 questions, twice: 1,200 evaluations, not 12. Mind that arithmetic when a provider bills per request.&lt;/p&gt;

&lt;p&gt;Multi-goal analysis, including a Pareto front, keeps cost and quality trade-offs visible instead of collapsing them into one early score. It describes what you measured, not the best system that could exist. Bring an evaluation method you trust, because there is no universal judge of LLM answers, and test the evaluator with a deliberately wrong answer. Generation is deterministic; a remote model isn’t, so record versions, settings and rate limits.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hand your assistant an experiment, not a vibe
&lt;/h2&gt;

&lt;p&gt;The model and the recorded evidence are files, so a second engineer, or a later assistant session, can pick them up without reconstructing a chat. Give your assistant evidence, not a symptom:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Here is the failing candidate (submit → timeout → retry → confirmation) and the two charge IDs it returned. The invariant is one request key, at most one charge. Propose a mechanism that fits this evidence, a focused change, and which existing cases would distinguish your explanation from the alternatives.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That asks for a testable claim instead of a guessed fix. Then rerun the same candidate and its surrounding histories against the change: if a repair fixes one sequence and breaks another, the regression stays visible.&lt;/p&gt;

&lt;p&gt;The repo is built for this hand-off. The manual, &lt;code&gt;AI_DELEGATION.md&lt;/code&gt;, is written for an AI operator acting for a human supervisor, and the desktop’s AI_delegation button copies its path for you to paste. Copying a path isn’t consent. The manual’s first rule is &lt;strong&gt;no agreement, no operation&lt;/strong&gt;: the assistant needs your explicit yes, then must ask before it finalizes the design, executes any case (a smoke run comes first), builds or installs anything, or touches the network, files outside the agreed workspace or your system under test. It must report what it did and didn’t check, and never present a plausible explanation as an observed result. You stay the director, and the license makes that a condition.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it small
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Pick a behavior you already understand, ideally a defect you’ve already fixed.&lt;/li&gt;
&lt;li&gt;Write three or four factors, one troublesome sequence and one invariant.&lt;/li&gt;
&lt;li&gt;Stay small enough to preview every candidate, and change one thing at a time.&lt;/li&gt;
&lt;li&gt;Inject a fault into a local implementation. Does the scenario catch it? Fix it and rerun.&lt;/li&gt;
&lt;li&gt;Save the scenario, run ID, checkpoint and evidence.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you can express the behavior, understand the generated cases and recognize a useful failure, it fits. The manual itself rates a few situations as poor fits: one or two parameters, purely continuous spaces, no reliable oracle, and state you can’t reset. Use unit or property tests, fuzzing or an optimizer there, and keep the plain unit test whenever it already pins a defect down. Reach for a scenario model when the variations themselves are getting hard to track.&lt;/p&gt;

&lt;h2&gt;
  
  
  Requirements, status and license
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;First of all:&lt;/strong&gt; &lt;em&gt;AS IS..., no warranty&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Requirements:&lt;/strong&gt; JDK 25, a full JDK with the compiler rather than a bare JRE, because generated cases are compiled in memory. The core workflow needs no Python, no relational database and no containers. Python 3.11+ and the Python add-on are optional, for Python candidates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Status:&lt;/strong&gt; first public release (Oct 2026), one maintainer. It’s early-stage, so validate it on your own workload before it carries anything critical.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The case for it is specific.&lt;/strong&gt; Interacting settings, action sequences and timed events get one shared model, the model becomes inspectable candidates, and the results stay available for review and retesting. For the bugs that live &lt;em&gt;between&lt;/em&gt; individually working features, and for AI-assisted work that needs evidence rather than confidence, that’s worth a small trial.&lt;/p&gt;

&lt;p&gt;Don’t ask it where your bugs are. Tell it what varies and what must stay true, then read what comes back.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;P.S.&lt;/strong&gt; &lt;em&gt;You are a Scenario Test-space Architect/Designer (puzzle-items of any kind) and a supervisor of AI (who operates on "Combinatorics Framework" as a precise tool for all of these)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;🧩🧩🧩🧩🧩&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/ghYura/Combinatorics-Framework-JVM/releases" rel="noopener noreferrer"&gt;GitHub project and downloads&lt;/a&gt;&lt;/p&gt;

</description>
      <category>testing</category>
      <category>qa</category>
      <category>ai</category>
      <category>automation</category>
    </item>
    <item>
      <title>🚀 Brand new testing approach with Combinatorics Framework</title>
      <dc:creator>Yurii Baranov</dc:creator>
      <pubDate>Sat, 05 Sep 2026 15:16:11 +0000</pubDate>
      <link>https://dev.to/yb_combi/brand-new-testing-approach-with-combinatorics-framework-2mk7</link>
      <guid>https://dev.to/yb_combi/brand-new-testing-approach-with-combinatorics-framework-2mk7</guid>
      <description>&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Unit tests? &lt;br&gt;
Ancient history (AI writes those for you).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pairwise matrices? &lt;br&gt;
Static parameters only.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How do you test dynamic, stateful scenario spaces in complex systems to be tested?&lt;br&gt;
Meet &lt;strong&gt;Combinatorics Framework&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s a declarative scenario-space engine:&lt;/p&gt;

&lt;p&gt;🧩 Compose: Higher-order dataflow algebra (permutations, subsets, joins of prior result tables)&lt;/p&gt;

&lt;p&gt;⚡️ Inject: Mid-sequence rules, constraints, and optional interventions before execution&lt;/p&gt;

&lt;p&gt;⚙️ Execute: Real candidate scenarios in sandboxed System-Under-Test environments&lt;/p&gt;

&lt;p&gt;📊 Analyze: Multi-objective outcomes via Pareto-front evaluation&lt;/p&gt;

&lt;p&gt;From AI-agent red-teaming and protocol resilience to stateful system validation—stop running static matrices. Start executing real scenario spaces.&lt;/p&gt;

&lt;p&gt;Master the mindset: ZEN_OF_COMBINATORICS.&lt;/p&gt;

&lt;p&gt;Combinatorics Framework by Yurii Baranov&lt;/p&gt;

&lt;p&gt;▶ GitHub: &lt;a href="https://github.com/ghYura/Combinatorics-Framework-QA-edition" rel="noopener noreferrer"&gt;https://github.com/ghYura/Combinatorics-Framework-QA-edition&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;▶ YouTube: &lt;a href="https://www.youtube.com/@yuriibaranov" rel="noopener noreferrer"&gt;https://www.youtube.com/@yuriibaranov&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Combinatorics Framework&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;Beyond what AI can conceive, beyond what humans can execute alone&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;P.S. I care about QA jobs for humans. In a world going crazy over AI hype, this framework isn't built to replace testers—it’s built to elevate QA engineers into Scenario Architects who design execution spaces no plain AI can figure out on its own.&lt;/p&gt;

&lt;h1&gt;
  
  
  automation #testing #softwareengineering #qa #computerscience #aievals #devops
&lt;/h1&gt;

</description>
      <category>automation</category>
      <category>testing</category>
      <category>computerscience</category>
      <category>tools</category>
    </item>
  </channel>
</rss>
