soar·quest

§1The framework

Soar Quest

The AI never writes code. It edits a spec.

An AI edits a validated, declarative app spec through six fixed operations — it never generates source code. A single Go binary interprets that spec and serves a live, working business app.

sq5 · spec console — captured 2026-07-22, deterministic
beat 1 — the request

Create a Jobs tracker with a status pipeline: quoted, scheduled, done.

beat 2 — the tool calls (real op batch)
createNode(entity, { name: "Job", label: "Job" })
createNode(field, { name: "title", type: "text", required: true })
createNode(field, { name: "customer", type: "text" })
createNode(field, { name: "status", type: "enum", options: ["quoted", "scheduled", "done"] })
createNode(field, { name: "scheduledDate", type: "date" })
connect(Job, "fields", title · customer · status · scheduledDate)
commit()

✓ validated · versioned (ver_000001, seq 1) · materialized → t_ent_000001 (4 columns)

fig. 01 — the interpreter renders the committed spec

01Run it yourself

One binary. No runtime underneath.

$ ./sq5 init-app --name "Contacts" --dir ./sq5-data

single static Go binary · pure-Go SQLite (no cgo) · no runtime dependencies · ~35 MB

02Validation, shown failing

The rejection is the feature.

The spec is data, edited only through six validated operations. A batch that breaks an invariant writes nothing — the engine returns a structured rejection, {code, closure}, carrying exactly the pointer a one-step fix needs. Captured verbatim from sq5 console apply:

batch 2 — add another field to entity Job (ent_000001) commit → rejected
@@ entity Job (ent_000001) · edge fields @@ field title (fld_000001) · text · required field customer (fld_000002) · text field status (fld_000003) · enum [quoted, scheduled, done] field scheduledDate (fld_000004) · date {"op": "createNode", "ref": "f5", "type": "field", "props": {"name": "title", "type": "text"}} {"op": "connect", "from": "ent_000001", "edge": "fields", "to": "f5"}
{
  "ok": false,
  "rejection": {
    "violations": [
      {
        "code": "uniqueness",
        "message": "duplicate field name \"title\" in entity \"Job\"",
        "closure": {
          "conflictingId": "fld_80qdsw0d",
          "existingId": "fld_000001",
          "name": "title",
          "scope": "entity:ent_000001"
        }
      }
    ]
  }
}
the one-step fix — rename before connecting; recommit:
{"op": "createNode", "ref": "f5", "type": "field", "props": {"name": "notes", "type": "longtext"}}
{"op": "connect", "from": "ent_000001", "edge": "fields", "to": "f5"}
→ {"ok": true, "version": {"id": "ver_wmnqb22g", "seq": 2, "createdAt": "2026-07-22T12:07:00Z"}}
what the rejected batch touched on disk: nothing — sq5 console schema before / after the fix +
t_ent_000001 · columns (after ver_wmnqb22g):
  id · created_at · updated_at · version · created_by · updated_by · tenant · deleted_at
  c_fld_000001  c_fld_000002  c_fld_000003  c_fld_000004  c_fld_q3f4x4ej   ← the fix

versions: ver_000001 (seq 1) · ver_wmnqb22g (seq 2) — the rejected batch touched neither.
The closure names the conflicting node, the existing node it collides with, the value, and the scope — a repair needs no re-reasoning from an error string.

03Architecture as content

Five invariants, stated as engineering decisions.

Spec is data, edited only via 6 opsBounded, reversible, diffable. No free-text code generation anywhere in the write path.
Validate at commit, not per-opA change is N ops applied atomically; only the result is checked. Half-applied states cannot exist.
spec-ops ≠ data-ops — hard boundaryEditing structure and writing a record are separate APIs, separate MCP surfaces. A prompt-injection in one can't reach the other.
Deterministic coreThe op-apply engine is a pure function of (state, ops, clock, gen) — clock and ID generation always injected, never time.Now() or rand inside the engine. Replayable byte-for-byte.
Immutable versions + append-only op-logEvery change diffable, reversible, replayable. A rename is a spec edit against stable IDs, never a schema migration.

04Prove it

The claim is falsifiable. So we falsify it, continuously.

Over cold build prompts we measure first-pass-green — the AI's generated spec passes its own generated tests on the first commit — and flat-drift — held-out tests still green after an unrelated edit. Drift is the antidote to code-generation's climbing debt: the write path is always the same six validated ops, never freehand code.

Phase / scopeModelGreen%Drift%Verdict
P0 — 8 entity+field appsclaude-sonnet-4-6100% (8/8)0%PASS
P1 — booking, ordersclaude-sonnet-4-6100% (2/2)0%PASS
P2 — full gate, incl. team-tasks permsclaude-sonnet-4-690.9% (10/11)0%PASS booking borderline cold, fixed
P3 — logic promptsclaude-sonnet-4-6100% (3/3)0%PASS
P4 — first slice (agentStep)claude-sonnet-4-6100% (1/1)0%PASS
Current gate — deterministic25/25 = 100%0%PASS held flat through every P5 slice
bar: ≥80% green / ≤5% drift baseline model: claude-sonnet-5 · historical rows ran on claude-sonnet-4-6, kept as-run methodology →

05The catalog · from sq5 catalog

Six fixed verbs reach the entire framework.

Everything below — every node type, view, workflow step, block, field, and function — is created, wired, and reordered through the same six operations. No seventh verb has ever been needed.

6ops
34node types
26view kinds
20step kinds
43block kinds
28field types
87expr. functions
all 34 node types, verbatim from the catalog
entityfieldrelationvalidationviewrolerulestateMachinetriggerworkflowstepconnectioncredentialslotaiProviderpriceslatickrecurrencefederationderivationmixinsequencetemplatecomponentstyleClassthemedesignKitwebhookOutblockqueryoptionSetflagformatRule

06Finished things

Real apps, running right now.

Every card opens a live app the interpreter is serving — anonymous read-only share links, no sign-up. Not screenshots.

The showcase

Field Service

Everything at once: dispatch board, calendar, crews and resources, invoices, job photos, a live ops dashboard.

Open live read-only · no sign-up
Finance stack

Invoicing

Gap-free numbering, exact-decimal totals and tax, payments, printable PDFs, per-client portal access.

Open live read-only · no sign-up
From one paragraph

Paws & Claws Grooming

Built by demo-factory from a one-paragraph brief — appointments, groomers, pet records.

Open live read-only · no sign-up

All ten live demos →

07Under the hood

One pipeline, end to end.

A plain-English request becomes MCP tool calls, staged ops, one atomic validated commit, an immutable version, a materialized SQLite schema — and the generic Lit SPA renders it. No app-specific code anywhere in the path.

chatMCP tool calls6 opsvalidatecommit · versionmaterializerender

Read the architecture

08Authorship

Designed and built by Ahmed ElBatanony. Go · ~95,000 lines · 924 tests · 618 commits.

Need this built for your business? See the offer →