Build branching intake forms that learn from one free-text answer. A deterministic DSL defines what you need. An LLM extracts what it can. The engine only asks what's left.
Not another form builder. A rules engine that speaks LLM.
Six verbs — ask, say, header, btw, warning, confirm — define a branching flow in pure Ruby. No YAML. No GUI drag-and-drop.
The clarify verb sends one paragraph of free text to Claude or GPT and gets back structured, typed answers. Downstream questions are automatically skipped.
Every flow serializes to JSON. Rules are AST objects, not lambdas. The frontend evaluates branching locally — zero server round-trips for pure logic.
String, text, integer, decimal, currency, boolean, enum, multi_enum, date, email, phone. Each maps to the right widget on every platform — TTY, web, mobile.
Running totals for pricing, complexity scoring, and feature gating. Declare once at the flow level, contribute from any step, read at runtime or post-processing.
One <script> tag. The JavaScript widget renders in shadow DOM, fetches flow JSON from an API, walks it client-side, and posts answers back.
A Ruby DSL declares every question, data type, transition rule, and widget hint. The definition is frozen and thread-safe.
The user types one paragraph. The clarify verb sends it to an LLM with a strict schema. Structured data comes back in under 2 seconds.
Engine#prefill! merges extracted answers. Every downstream step with skip_if not_empty auto-advances. The user only answers what's left.
SFRuby, April 2026 — Deterministic DSL meets Probabilistic LLM
A simple W-2 filer answers 8 questions. A complex business filer answers 17. Same definition.
Inquirex.define id: "tax-intake" do start :describe ask :describe do type :text question "Describe your tax situation." transition to: :extracted end clarify :extracted do # LLM extracts structured data from :describe schema filing_status: :enum, dependents: :integer transition to: :filing_status end ask :filing_status do type :enum question "Filing status?" skip_if not_empty(:filing_status) # auto-skip if LLM filled it transition to: :done end say :done do text "Thank you!" end end
The gems are MIT-licensed and free forever. qualified.at is the hosted platform launching Q2 2026.