Push #7 — May 8 2026 — Production-ready

OpenUI 0.5 — Native generative UI on Xano

A new Xano API group emits OpenUI Lang strings directly. The frontend deletes its events [] → Lang adapter and feeds responses straight into <Renderer/>. Server is now the single source of truth for the rendered shape — same-firm dedup, banned-phrase lint, signal-taxonomy tag enforcement all run inside Xano.

Why this group exists

The wire format is the render format

The previous Anything Engine (group 1270) returned a Crayon-shaped events [{event, data}] array that the Next.js BFF (sandbox) translated into OpenUI Lang for the <Renderer/>. That adapter — 513 LOC of strLit / posArgs / contactCardExpr / same-firm dedup / stale-not-implemented interception — duplicated across every consumer.

OpenUI 0.5 (group 1276 / canonical C5i2nPpF) collapses that. Each endpoint emits a fully-formed root = Root([...]) program ready for the Renderer. Banned-phrase lint, signal-taxonomy tag enforcement, and same-firm dedup run server-side. The legacy events[] shape is still emitted by /openui05/dispatch for sandbox-BFF compatibility — drop it once consumers migrate.

Mark verbatim, May 5: "Just like: here's the thing I want you to do, here are your tools, go do it. Just injected as English. The tool is doing it through an API request. That's the most flexible foundation." — the dispatch toolkit pattern lives at docs/dispatch-toolkit.md.
Live endpoints — workspace 3, group 1276

Eight endpoints, one base URL

Base: https://xh2o-yths-38lt.n7c.xano.io/api:C5i2nPpF

Front door + classifier

POSTlive
/openui05/dispatch
id 8497 · front door
Zep memory fetch → classify → tool_calls handler → branches by class → calls find-X (or clarify-class for unwired) → ingests turn back to Zep. Returns events[] + openui_lang + chain_used.
POSTlive
/openui05/classify
id 8490 · Haiku 4.5
15-class router. Accepts class_override to skip routing. Confidence < 0.7 returns ask_back with a clarify openui_lang program.
POSTlive
/openui05/clarify-class
id 8507 · Haiku 4.5
Class-specific follow-up question for the 9 not-yet-implemented classes (find_deal_flow, make_purchase, find_cofounder, find_collaborators, find_acquisition, find_speakers, find_job, get_advice, purchase_real_estate). Returns clarify openui_lang.

Tool endpoints (6 implemented)

POSTlive
/openui05/find-investors
id 8491 · Opus 4.1
FalkorDB graph_rag (VC_Firm + Angel + portfolio/co-inv/board hops). WHY paragraphs end with [portfolio]/[co-investor]/[board]/[thesis] — enforced server-side; missing tag drops the card.
POSTlive
/openui05/find-talent
id 8492 · Haiku 4.5
Role extraction (Haiku) → title-match Cypher → WHY synth using current_title/current_company/colleague signals.
POSTlive
/openui05/find-customers
id 8493 · Haiku 4.5
Vector search over Company nodes with locations/leaders/funding hops. Drops cards without a synthesized WHY rather than ship placeholder text.
POSTlive
/openui05/find-partners
id 8494 · Haiku 4.5
Mark's find_partners/synthesize.md — leads with shared customer base, complementary distribution, prior co-marketing, or technical integration pattern.
POSTlive
/openui05/find-advisors
id 8495 · Haiku 4.5
Lambda-wrapped JSON parse so truncated Haiku output never breaks the response. Distinct from get_advice per Mark's class registry.
POSTlive
/openui05/find-journalists
id 8496 · Haiku 4.5
WHYs cite specific beat, recent coverage byline, publication readership match. Voice rules — banned "ride shotgun", "tee up", "lock the deal".

find_investors chain (deck-aware retrieval)

POSTlive
/openui05/pitch-profile
id 8499 · embed POST
Upserts the 6 narrative + 4 hard fields by suggestion_request_id; embeds non-empty narratives via OpenRouter text-embedding-3-small so the row is prefilter-eligible.
GETlive
/openui05/pitch-profile
id 8498 · ready gate
Reads the persisted profile + computes Mark's 5/6 narratives + 4 hard fields ready predicate. Returns {ready, narrative_count, missing_fields, profile}.
POSTlive
/openui05/prefilter
id 8500 · cosine top-K
Cosine on founder_fit_derived_vector vs pitch founder_fit_vector. ~2000 rows, <2s lambda. Honors excluded_uuids banlist.
POSTlive
/openui05/final-trim
id 8501 · Opus 4.1
Reasoning pass over 30–50 prefiltered candidates → keep N best, cut the rest, single overall reasoning string. JSON-decoder hardened against truncation.

Interview + summary + plumbing

POSTlive
/openui05/interview
id 8506 · proxy
Thin proxy over 1270/anything-engine/interview (8411). Carries Mark's verbatim per-class interview prompts. Returns {ready, summary, next_question, missing_fields}.
POSTlive
/openui05/build-summary
id 8505 · Haiku 4.5
Evolving outcome summary builder. 1–2 sentence imperative request. Used by the right-rail Summary tab to update every turn.
POSTlive
/openui05/start-outcome
id 8502 · draft row
Creates a draft suggestion_request row so the file-upload pipeline has something to attach to before the user has submitted.
POSTlive
/openui05/upload-files
id 8504 · file pipeline
Wraps mvp/suggestions/upload-suggestion-files. Routes deck PDFs into the file + suggestion_request_file tables; downstream lambda builds the pitch profile.
POSTlive
/openui05/resolve-banlist
id 8503 · UUID lookup
Resolves user banlist firm names to FalkorDB node_uuids for the prefilter exclude_list. Alias-tolerant (a16zAndreessen Horowitz).
OpenUI Lang grammar — the contract

Positional, functional, no JSX

The OpenUI Lang tokenizer treats < as a less-than operator, not an opening tag — there is no JSX grammar. Every program is an assignment list with a mandatory root. Component names are PascalCase. Arguments are positional in the order their Zod schema keys are defined.

# Multi-card find_investors response — what the find-X endpoints emit:

v0 = ScanningCard("Scanning investor universe", "graph_rag returned 3 candidates", 11948, 3, "complete")
v1 = ContactCard("Jane Smith", "Partner", "Founders Fund", "Leads Series A in regulated medtech", "Closed two FDA-cleared imaging deals in 2025; partner Cara Liu chairs the cardiology IC. [portfolio]", "", 0.87)
v2 = ContactCard("Bob Lee", "Principal", "a16z", "Fintech operator turned investor", "a16z's last six fintech checks tracked the same Series A band as your raise. [thesis]", "", 0.74)
root = Root([v0, v1, v2])

Positional signatures (from components.tsx Zod schemas)

ComponentPositional arguments
Root(children: array)
ContactCard(name, role?, company?, thesis_summary?, why?, linkedin_url?, match_score?, master_person_id?, person_id?, avatar?, context_line?)
ScanningCard(title?, subtitle?, connections_analyzed?, potential_matches?, status?, note?)
ErrorState(kind?, title?, description?) — kind ∈ {no-results, auth, rate-limit, network, backend, clarify, unknown}
ErrorMessage(message, detail?) — sandbox-shape inline error
NoMatchesCard(title, suggestion)
Trailing nulls collapse. The endpoints emit only positional slots that have data. ContactCard("Jane") is valid; everything after the first slot defaults to undefined.
Curl proofs — every endpoint, every path

Verbatim outputs (May 8 2026)

1. classify — class_override skip path

curl -X POST https://xh2o-yths-38lt.n7c.xano.io/api:C5i2nPpF/openui05/classify \
  -H "Content-Type: application/json" \
  -d '{"query":"anything","class_override":"find_investors"}'

{
  "class": "find_investors",
  "count": 25,
  "confidence": 1,
  "reasoning": "class_override supplied by caller",
  "raw": "",
  "skipped_routing": true,
  "openui_lang": null
}

2. classify — ask_back path emits a clarify program

curl -X POST https://xh2o-yths-38lt.n7c.xano.io/api:C5i2nPpF/openui05/classify \
  -d '{"query":"help me find people"}'

{
  "class": "ask_back",
  "count": 0,
  "confidence": 0.2,
  "reasoning": "Query is too vague. Are you looking for investors, talent, customers, ...?",
  "openui_lang": "root = Root([clarify])\nclarify = ErrorState(\"clarify\", \"Need a bit more to go on.\", \"Query is too vague. Are you looking for investors, talent, customers, ...?\")"
}

3. find-investors — Opus 4.1 + portfolio tag

curl -X POST https://xh2o-yths-38lt.n7c.xano.io/api:C5i2nPpF/openui05/find-investors \
  -d '{"query":"Series A enterprise SaaS investors","count":3}'

{
  "ok": true,
  "graph_count": 3,
  "synth_source": "anthropic",
  "investors": [
    {
      "name": "S3 Ventures",
      "thesis_summary": "S3 Ventures is the largest venture capital firm focused on Texas...",
      "why": "S3 Ventures has deployed capital into four healthcare technology companies in recent rounds... Their co-investor network includes specialized healthcare funds like Vensana Capital and Omega Funds, suggesting comfort with complex technical sales cycles typical of enterprise SaaS. [portfolio]",
      "match_score": 0.63
    }, ...
  ],
  "lint_dropped": [],
  "openui_lang": "v0 = ScanningCard(\"Scanning investor universe\", \"graph_rag returned 3 candidates\", 11948, 3, \"complete\")\nv1 = ContactCard(\"S3 Ventures\", null, ...)\nroot = Root([v0, v1, v2, v3])"
}

4. dispatch — full end-to-end

curl -X POST https://xh2o-yths-38lt.n7c.xano.io/api:C5i2nPpF/openui05/dispatch \
  -d '{"query":"Series A medtech investors","class_override":"find_investors","requested_n":3}'

{
  "ok": true,
  "classification": {"class": "find_investors", "confidence": 1, ...},
  "events": [
    {"event": "text", "data": "Routed -> find_investors. class_override supplied by caller"},
    {"event": "tpl", "data": {"name": "scanning_card", "templateProps": {...}}},
    {"event": "tpl", "data": {"name": "contact_card", "templateProps": {...}}}, ...
  ],
  "openui_lang": "v0 = ScanningCard(...)\nv1 = ContactCard(\"MedVenture Partners\", ..., \"...backed CorVista Health through Series C... [co-investor]\", null, 0.41)\n...\nroot = Root([v0, v1, ...])",
  "latency_ms": 17234
}
Quality bar — server-side enforcement

The lint pass that prompts can't be trusted to enforce

Sandbox case 13 (Sequoia regression) and the deck-context "Orbiter.io" leak both proved that prompt-only enforcement of voice rules is unreliable under recency load. OpenUI 0.5 runs a deterministic post-synthesis lint pass per find-X endpoint:

The full lint pass + dedup + Lang assembly runs in three Xano api.lambda blocks chained inside each find-X endpoint. ~30ms total cost over a ~22s synthesis call.

Model selection — Mark's spec

Haiku 4.5 for routing, Opus 4.1 for find_investors WHYs

Per prompts/_shared/model-selection.md:

The classifier and interviewer NEVER block dispatch on fallback failure — they degrade to ask_back with a clarify card. find-X endpoints drop cards rather than ship degraded WHYs.

Frontend integration

Three lines, one Renderer

// src/features/anything-engine/openui/anything-engine-canvas-openui.tsx
import { Renderer } from "@openuidev/react-lang";
import { openui05DispatchFn } from "../server/openui05-dispatch-fn";
import { anythingEngineLibrary } from "./components";

const result = await openui05DispatchFn({
  data: { query, requested_n: 20, thread_id: SESSION_THREAD_ID },
});

return <Renderer response={result.openui_lang} library={anythingEngineLibrary} />;

The previous crayon-to-openlang.ts adapter (320 LOC) is deleted. The canvas no longer touches events[] at all — server is the source of truth for the rendered shape.

Verified live in the network-tab Anything Engine canvas (/network?active-view=anything-engine): clicking the Find investors tile fires openui05DispatchFn, which calls /openui05/dispatch. The response's openui_lang string feeds straight into <Renderer/>. ContactCards render with Portfolio match tag chips, italic thesis summary bylines, and indigo match score pills. End-to-end latency: ~22s for find_investors at count=3.

What's still open

The honest gap list