PRODUCT DESIGN / MULTI-AGENT AI / RAG
Role
Product design and full-stack build
Cervello answers only from Al Dente’s real data — and says so when something isn’t there.
The problem
Three systems hold the truth and none of them holds all of it. The answer to a normal question sits in a call recording, a production lot and a policy document at the same time. And some questions look normal but have no answer stored anywhere.
01
Does this complaint qualify for a return?
The call
The lot
The returns policy
02
Which semolina is in this SKU, and who supplies it?
Bill of materials
Inventory
Supplier record
03
What is the profit margin on this lot?
Not stored in any system
THE TRAP · THREE SHEETS, ONE SHAPE
PRODUCT SPECIFICATION SHEET
Penne Rigate n.73 — 500g box
PAS-PEN-500
The sheet the question means
PRODUCT SPECIFICATION SHEET
Penne Rigate n.73 Bio — 500g box
May contain: none
PRODUCT SPECIFICATION SHEET
Penne Rigate n.73 — 250g box
May contain: soy, mustard
Carton counts differ too. A nearest-neighbour search alone will quote the sibling.
It blends the sheets.
Penne 500g, Penne Bio and Penne 250g carry opposite allergen and pack facts. The nearest neighbour is the wrong document.
It invents totals.
A plausible figure appears where an aggregate should have been computed from actual rows.
It answers a metric nobody stored.
Profit margin reads like a normal question. The field is not in any source, so a confident number is the worst possible output.
And the interface usually hides all of that behind a spinner.
How a question moves
A coordinator routes the question, specialist agents read only the systems it needs, and a verifier checks that every number and ID in the answer appears in the evidence. Two of these questions have an answer. Two of them do not.
Interactive — pick a question and watch it resolve, or refuse
The router is not a single point of failure. Entity IDs and keywords build the full plan first; a smaller model only confirms the vertical. If that call fails or returns bad JSON, the heuristic plan stands.
The product
Five screens, and every one of them can be checked.
The question box, the map of the company, the document drawer and the cast that reads them.


The knowledge graph over the document library. Filters, search, and labels that stay hidden until hover.


The cast, over a cited answer. Only the agents that contributed stay lit once it resolves.
What it does
Each specialist reads only what its question needs. Nothing fans out across every system by default.
CRM
Customers, open opportunities, orders, invoices and channel totals.
ERP / Production
Inventory against minimum stock, bills of materials, suppliers and production lots.
Call logs
Complaint metadata first. A transcript search only when the metadata does not already hold the asked fact.
Knowledge base
Specs, allergens, shelf life, wholesale prices, the returns policy, HACCP, recall and related documents.
RESPONSE CONTRACT · ONE QUESTION, END TO END
Design target
Where a normal answer should land.
Internal deadline
The lane gives up and returns what it has.
Hard contract
Nothing is allowed to run past this.
An inline HTML sales deck, or a downloadable PDF, PowerPoint, Word or Excel file, branded with the Al Dente mark. A prospect with no orders is written as “no records”, not filled in. An unknown customer and a missing metric both produce no file at all.
HTML deck
PPTX
DOCX
XLSX
Retrieval
Every shape has a base 500g sheet, a Bio 500g sheet and a 250g sheet, and the facts disagree. Retrieval is built around that trap rather than around average-case similarity. Turn the stages off below and watch the wrong sheet win.
Interactive — switch the retrieval stages off and watch the wrong sheet win
Hyphen-aware tokenizer
BM25 keeps PAS-FUS-500 as one token and also splits it, so a SKU survives the search either way.
Embeddings shipped, not built
4096-dimensional vectors are computed once and ship with the app. The first question never pays to embed the corpus, and health checks never block on it.
Ambiguity beats a guess
If a question names a shape and still matches more than one sheet, the lane flags the ambiguity instead of picking a sibling. Superseded and draft lines are penalised so a cancelled figure is never the citation.
The company as a graph
A bounded crawl of customers, suppliers, products, raw materials and production lots. It is built once and cached, so it never runs inside a graded question. Filter it, search it, or pulse the slice one answer actually touched.
Interactive — filter it, search it, or light up the slice one answer touched
The AI layer
Four models, four jobs. None of them is asked to do arithmetic, and only one of them is allowed to write a sentence.
Route confirmation
Qwen3 27B
A cheap JSON confirm of a plan the code has already built.
Embeddings
Qwen3 Embedding 8B
4096-dimensional semantic rank, fused beside BM25.
Rerank
Qwen3 Reranker 4B
Reorders a short candidate list, nothing more.
Synthesis
Llama 3.3 70B
Prose only, constrained to a JSON answer field so a thinking process cannot leak into the graded text.
Synthesis is skipped entirely for honest abstentions, for metric traps, and for single-field facts that code can state exactly. Temperature is 0, calls are capped at four in flight and retried with backoff, and a hard failure becomes an abstention rather than a 500.
Honest abstentions
Metric traps
Single-field facts
Temperature 0
4 calls in flight
Retry with backoff
Four signals are weighted, with grounding heaviest at 0.40. The ring on screen is that score, and the hover breakdown is the same four numbers. Move them.
Design system
The visual system is Al Dente, not a generic AI theme. Three reading levels, one hue for every state the product can be in, and colour that means “data type” reserved entirely for the graph. It cycles its own states below.
Playing by itself — four states, one hue, the stylesheet rewriting itself
Inter for the interface, JetBrains Mono for IDs, paths and counts. Radii at 14, 20 and 28, concentric so a nested element is always smaller than the surface holding it. Two very quiet radial washes give the black field temperature without lifting the content off it.
Design decisions
Each of these started as something that did not work.
FIG 0.1
Six characters had to read as one team, and the loop that plays while an agent works is video — and video has no alpha channel, so every mascot arrived sitting in a black box. Generating the six from one robot kept them a family; sitting the loops on black with mix-blend-mode set to lighten drops the black and keeps the light, so a mascot floats instead of sitting in a cut-out.
FIG 0.2
The first pass ran five differently coloured beams into the coordinator and read like a network diagnostic. One warm gold family now holds the entire working state: source agents on a wide top row, beams falling and converging on Maestro, Vera beside the coordinator. The loader names the phase in its own lane, so the cast never has to double as a progress bar.
CRM
98
CUST-0132 has 4 open opportunities, totalling 740,000 EUR.
crm/opportunities
crm/opportunities
crm/opportunities
FIG 0.3
Confidence, citations and the answer started as separate panels — a reader could finish the sentence and never reach the evidence. They are one cluster now, and every chip names the endpoint or document it came from. The bento underneath is evidence rather than decoration: nodes touched, sources, calls made, bytes moved, and who worked.
FIG 0.4
A deck leaves the product and gets forwarded, and unbranded it stops looking like it came from the company. Every artifact carries the Al Dente mark and a footer, and the same discipline as the answer applies to the file — a prospect with no orders is written as “no records”, and a request for a PDF of a missing metric writes no file at all.
→
One moving stroke on the whole page. Everything else is hairline and type.
FIG 0.5
Vanish input, hover border, bento grid, step loader and the beam effect are Aceternity patterns. Pulled in as a dependency they arrive with their own palette and their own motion, so each one was copied into the repo and retokened. The moving gold stroke survives in exactly one place — the border around the composer — where it marks the only thing you are meant to type into.
FIG 0.6
Five entity colours are necessary on the map and poisonous everywhere else, and a hundred lot IDs as always-on labels made it unreadable. Product chrome stays in the gold and ink system, the five colours appear only on nodes, and lot and customer labels stay hidden until hover.
Engineering choices
01
Facts before prose
Channel totals, complaint counts, stock against minimum and bill-of-materials chains are computed in code. The model writes language around numbers it did not calculate.
02
JSON synthesis
Free-form completions leaked a thinking process into the answer. Constraining the model to a JSON answer field closed that, and a placeholder echo falls back to the deterministic lane answer.
03
Always 200
Empty bodies, bad JSON, timeouts and missing keys all abstain inside a valid envelope. Neither the evaluator nor the interface ever has to handle a 500 for a bad question.
04
One service
The React app builds into the FastAPI static folder. Production is a single Railway service in the EU, with no Node process. Dev proxies /ask and /api to the API.
05
Graph off the hot path
The company graph is crawled once, cached, and served from its own endpoint. It never runs inside a graded question.
06
Call discipline
Calls are read from summary, topic and related lot before any transcript is downloaded. A transcript search is one surgical query, used only when the metadata lacks the asked fact.
Result
A platform dry-run before the grounding pass scored 15 on 16 questions, with ERP and call logs failing on invented or missing facts. The fix was structural rather than cosmetic: lot and inventory handlers, deterministic field answers, value-line snippets, and a verifier that can replace an ungrounded number with the deterministic lane answer.
Before · platform dry-run
Scored on the platform, before the grounding pass.
ERP and call logs failed on invented or missing facts.
A plausible number appeared where no field existed.
After · local harness
28 cases, built from real API rows and knowledge-base documents, scored locally.
Every vertical positive. No wrong answers.
No refusals on questions that did have an answer.
All of them under 8 seconds.
The 280 is a local, judge-style harness — a process result from my own evaluation, not a score signed off by a public judge. It is here because it is what the grounding pass was measured against.
Cervello treats a company question as a retrieval and verification problem with a face. Everything on the screen — the cast, the ring, the citation chips, the graph — exists so a reader can check the sentence instead of trusting it.
EXPLORE ANOTHER PROJECT







