Every booked call opens a customer room. Inside it, the prospect finds one page: where the firm is invisible today, on Google and in AI answers, and who takes the clicks instead. This page explains how that analysis is produced, how it is checked without a person, and how you tune it.
Before the call: one sentence, the rest blurred behind a lock. After the call: the full page. Nothing on it is written by a model. The sentences are fixed building blocks with numbers filled in.
"Bei 4 von 6 Suchanfragen in Deutschland werden Sie heute nicht gefunden." Or the AI version: not named in 5 of 7 questions to ChatGPT, Perplexity and Google.
AI answers: who gets named instead. Google: a ranking table, the prospect against three competitors. Competitors: monthly searches, the clicks they take, and a slider for order value.
"Das haben wir für Sie schon angesehen": AI, Google, competitors, website technology. Then one line on backlinks: catching up, or the basis is fine.
Eleven of these pages are live as real rooms in the Superapp (Dominik has the links), and the full data of all 50 companies is in the repo under eval/visibility-check/2026-09-02/. They show what a good page looks like, what a page with nothing to say looks like, and what a stopped page looks like.
One run per booking, started by the room engine. The stages below run in order. Deterministic steps are grey, the three model gates are gold.
Start page and Impressum, plain HTTP first. The town comes from the Impressum; the CRM town is only a hint.
A model reads the text and proposes trade, core term, services, reach (regional, several sites, national), town and country. Whatever the prospect wrote in the welcome form is locked and beats the model.
Before any data is bought: is the trade unambiguous, is the reach right, are the towns real, are the terms how customers search? It may correct three fields, drop or add terms, or stop the run (a municipality, an unreadable site). It may change the core term only to a word that stands on the site.
Candidate terms come from Google's own data: what the prospect already ranks for, what people type around the core term, volume and intent. Noise goes: brands, recruiting, how-to, used goods, renting (unless the prospect rents). One search result page per candidate is bought, at the main town for regional firms.
The top 10 of the core term, minus portals and the prospect, are the firms of this trade. A candidate whose top 10 shares none of them measures another market and is dropped. A term whose top result is a firm named in the term is a brand search and goes. A core term owned by portals stops the run.
The final query set (validated terms times places, plus "beste", "anbieter", "kosten" variants), AI answers from ChatGPT, Perplexity and Google, the maps block, on-page health, backlinks. Identical queries from a previous run are reused, not bought again.
Ranked by how often and how high they appear across the queries; portals, directories and the prospect's own other domains are excluded. For the top twelve, title, H1, description and address are fetched as evidence.
Per candidate: is this one firm, a chain, a portal, a manufacturer, a directory? Same trade, same region? Keep, drop or unsure; unsure means drop. The display name must appear in the evidence. Code then strikes only on a contradiction: a rental or used-goods word in the evidence and none of the prospect's service words.
Found or not per query, clicks per competitor from position and click rate, market volume, the hook, the gap line. The lint checks arithmetic and structure in code: hook equals table, scope names every place, no own domain among competitors, at most three brakes.
Reads the page as the customer would, plus the evidence behind every counted AI mention and every competitor. Findings with a severity, and actions from a whitelist: reject a mention, drop or swap a competitor, drop a query, exclude an AI domain. Two rounds at most. Block means the page fails.
approved: the server shows the hook before the meeting and the full view after it, computed per request from the meeting time. needs_review: nothing reaches the customer, Dominik gets a Slack alert, the cockpit shows the protocol and offers force-release. The auto-release flag stays off until the numbers hold.
The model never writes customer text and never changes a number. It corrects inputs, rejects candidates and judges. Every action is applied by code, validated against evidence and logged. Text from other websites and from AI answers counts as untrusted data in every prompt.
| Gate | Sees | May do | If the model is down |
|---|---|---|---|
| 1 Profile | Site text, CRM name and town, the profile proposal with its sources, candidate terms with volume and intent | Correct up to three fields, drop terms, add two, stop the run | Stop before any spend, status needs_review |
| 2 Competitors | Top twelve candidates with ranking signals, towns, maps rating, fetched title, H1, description, address | Keep, drop, unsure per candidate; a display name only from the evidence | No unreviewed competitor is shown; the run ends needs_review |
| 3 Review | The full page, the profile with sources, gate 2's verdicts, every AI mention with 160 characters of context, the lint findings | Findings plus whitelisted actions, two rounds | No approval without a review; the raw data stays and a later review costs nothing new |
Prompts live in tool/reports/check_review.py. Every change of a prompt is a new PROMPT_VERSION, so every number in a report can be tied to the prompt that produced it.
Each rule exists because a run on a real company produced something a prospect would have caught. They are deterministic; the gates judge on top of them. The full list with the story behind each is in docs/PROSPECT-CHECK.md. The ones you will meet first:
The proof set: 50 won customers of Glow Careers from Close, 40 for tuning, 10 held back. Each page was judged by hand against the live data (correct or not, send or not, every shown competitor, every counted AI mention). The gates are then measured against that judgement.
| Metric, 40 tuning companies, Kimi K3 | Value | Target |
|---|---|---|
| False pass: gates pass a page a person would not send | 1 | 0 |
| False fail: gates reject a page a person would send | 4 of 25 | at most 15 % |
| Competitor precision (shown competitors that are right) | 0.97 | 0.95 |
| False AI mentions still counted after review | 0 | 0 |
| Profile right (reach, town, core term) | 96 % | 90 % |
| Cost per run, mean and p95 | $0.40 / $0.59 | $0.60 / $0.75 |
| Duration p95 | 7 min | 4 min |
The one false pass is SBS Technik, a crane-service firm from Andernach whose profile came out as national; the national page names crane-rental chains as rivals. The welcome form question "Wo sind Ihre Kunden?" fixes that case: the prospect's answer locks the reach.
Of the 50 pages, 27 pass automatically. Eleven of the rest are correct pages with nothing to show: the firm is found everywhere and named everywhere, so there is no hook. That is a feature. The test set is made of established companies; Omni1's prospects arrive because they have a visibility problem.
Seven models ran on identical prompts, identical cached data and identical gold, each twice. The two models without a false pass reject almost everything (Qwen fails 20 of 39 correct pages, GLM flips every third verdict). Kimi K3 and Claude Sonnet 5 are equally stable; Kimi rejects fewer correct pages and returns cleaner JSON, Sonnet is faster. Kimi K3 stays, Sonnet 5 is the fallback. The full table is in eval/run-1/models.md on the VPS.
27 of 50 is not "27 good, 23 bad". Most of the 23 are pages that must not go out, and the gates were right to hold them.
The gates passed the page and a person would send it too.
The firm is found for every query and named by the AI answers, so there is no hook. The page is right, but there is nothing to open a conversation with. Correct behaviour; the test set is made of established companies, prospects who come to Omni1 have a visibility problem.
The gates stopped a page that was wrong or worthless: a municipality, a wrong market (IABG), a rental market (Teupen), a firm that is visible anyway (PohlCon), a shop-press market (Wickert).
A person would send the page, the reviewer rejected it. All four are the same thing: gate 3 flags one query as measuring another market ('regalsysteme', 'kunststoffsortierung', 'chemietank') and a block on that code fails the page. This is the first tuning target.
The gates passed a page a person would not send. SBS Technik: the profile came out as national, so 'Krandienstleistung' was measured nationwide and the crane-work firms of that market are shown as rivals. The welcome form question about reach fixes this case; without an answer it stays a known miss.
Correct page, market volume 10 searches a month, everything found (Geiger). Report only.
Ten companies kept back for the final measurement with the chosen model. Their verdicts are in the table, their human judgement is still open.
Of the 25 tuning pages a person would send, 21 pass automatically. Of the 15 that must not go out, 2 slip through. Start with the four false fails: one code, one prompt sentence, measurable on the cached data in ten minutes.
| Company | Trade | Verdict | Hook | Class | Why |
|---|---|---|---|---|---|
| 247TailorSteel Deutschland GmbH | Metallbearbeitung / Lohnfertigung | pass | Bei 2 von 4 Suchanfragen in Deutschland werden Sie heute nicht gefunde | auto-pass, right | |
| ATZ GmbH Industrieautomation | Industrieautomation | pass_with_notes | In KI-Antworten werden Sie bei 4 von 4 Fragen in Deutschland nicht gen | auto-pass, right | |
| Balm Meggen AG | Hotel und Restaurant | pass | Bei 4 von 6 Suchanfragen in Meggen und Luzern werden Sie heute nicht g | auto-pass, right | |
| Contigo Energie AG | Energieberatung und Energiedienstleistung | pass | In KI-Antworten werden Sie bei 12 von 12 Fragen in Deutschland nicht g | auto-pass, right | |
| Düdal Leichtmetall-Giesserei AG | Aluminiumgiesserei | pass_with_notes | In KI-Antworten werden Sie bei 3 von 3 Fragen in der Schweiz nicht gen | auto-pass, right | |
| e.optimum AG | Energie-Einkaufsgemeinschaft | pass | Bei 4 von 5 Suchanfragen in Deutschland werden Sie heute nicht gefunde | auto-pass, right | |
| GIFAS ELECTRIC GmbH | Elektrotechnik Hersteller | pass_with_notes | Bei 2 von 5 Suchanfragen in Deutschland werden Sie heute nicht gefunde | auto-pass, right | |
| Haldimann AG | Entsorgung und Recycling | pass | In KI-Antworten werden Sie bei 3 von 8 Fragen in Murten und Fribourg n | auto-pass, right | |
| O. Jeker AG Haustechnik+Schwimmbad | Haustechnik und Schwimmbadbau | pass | In KI-Antworten werden Sie bei 3 von 8 Fragen in Breitenbach und Reina | auto-pass, right | |
| Kmhp Engineering GmbH | Sondermaschinen- und Anlagenbau | pass_with_notes | In KI-Antworten werden Sie bei 3 von 3 Fragen in Deutschland nicht gen | auto-pass, right | |
| LAUPP GmbH | Aluminium-Druckguss | pass_with_notes | In KI-Antworten werden Sie bei 3 von 3 Fragen in Deutschland nicht gen | auto-pass, right | |
| MAC Mode GmbH & Co. KGaA | Jeans Online-Shop | pass | Bei 6 von 9 Suchanfragen in Deutschland werden Sie heute nicht gefunde | auto-pass, right | |
| Niebling Technische Bürsten GmbH | Technische Bürsten Hersteller | pass | Bei 2 von 6 Suchanfragen in Deutschland werden Sie heute nicht gefunde | auto-pass, right | |
| Paul Reuter GmbH & Co. KG | Kunststoffprofile Extrusion | pass_with_notes | Bei 4 von 6 Suchanfragen in Deutschland werden Sie heute nicht gefunde | auto-pass, right | |
| PEAK-Group | Gebäudeautomation und Digital Asset Management | pass_with_notes | Bei 4 von 4 Suchanfragen in Deutschland werden Sie heute nicht gefunde | auto-pass, right | |
| pro-bau GmbH | Bauunternehmen | pass | In KI-Antworten werden Sie bei 5 von 10 Fragen in Wangen-Schauwies, Fr | auto-pass, right | |
| Riedhammer GmbH | Industrieofenbau | pass | Bei 6 von 6 Suchanfragen in Deutschland werden Sie heute nicht gefunde | auto-pass, right | |
| smartblue AG | Photovoltaik-Monitoring und Steuerung | pass | Bei 3 von 7 Suchanfragen in Deutschland werden Sie heute nicht gefunde | auto-pass, right | |
| T.Werk GmbH | Hersteller Photovoltaik-Montagesysteme | pass | Bei 4 von 6 Suchanfragen in Deutschland werden Sie heute nicht gefunde | auto-pass, right | |
| Zwickauer Werkzeug- und Sondermaschinenbau GmbH - WESOMA | Werkzeug- und Sondermaschinenbau | pass_with_notes | In KI-Antworten werden Sie bei 3 von 3 Fragen in Deutschland nicht gen | auto-pass, right | |
| J. Wiest & Söhne GmbH | Autohaus | pass_with_notes | In KI-Antworten werden Sie bei 4 von 9 Fragen in Darmstadt, Bensheim, | auto-pass, right | |
| DESMA Schuhmaschinen GmbH | Schuhmaschinenbau | fail | (none) | withheld: nothing to show | no hook: found everywhere, nothing to open the conversation with; other (see message) |
| DIAMOND GmbH | Glasfaserkomponenten | fail | (none) | withheld: nothing to show | no hook: found everywhere, nothing to open the conversation with |
| Elektrizitätswerk Jona-Rapperswil AG | Elektrizitätswerk / Energieversorger | error | (none) | withheld: nothing to show | profile wrong (reviewer); no hook: found everywhere, nothing to open the conversation with |
| Fixatorenbau Bertuch & Co. GmbH | Maschinenelemente / Fixatoren für Werkzeugmaschinen | fail | (none) | withheld: nothing to show | thin page; no or one competitor; no hook: found everywhere, nothing to open the conversation with |
| hoffmann automobile ag | Autohaus | fail | (none) | withheld: nothing to show | no hook: found everywhere, nothing to open the conversation with; other (see message); hook and rows disagree |
| Kraemer Elektronik GmbH | Tablettenprüftechnik | fail | (none) | withheld: nothing to show | no hook: found everywhere, nothing to open the conversation with |
| Sauer u. Sohn Motorentechnik | Motorentechnik und Ersatzteilhandel | fail | (none) | withheld: nothing to show | no hook: found everywhere, nothing to open the conversation with; other (see message) |
| Solar Promotion GmbH | Messe- und Konferenzveranstalter Erneuerbare Energien | fail | (none) | withheld: nothing to show | no hook: found everywhere, nothing to open the conversation with |
| Burgergemeinde Thun | Burgergemeinde / Kommunalverwaltung | fail | Bei 4 von 7 Suchanfragen in Thun, Bern und Steffisburg werden Sie heut | stopped, right | profile wrong (reviewer); other (see message); no or one competitor |
| Industrieanlagen-Betriebsgesellschaft mbH | Technologie- und Sicherheitsberatung / Hightech-Prüfdienstleistungen | fail | In KI-Antworten werden Sie bei 6 von 6 Fragen in Deutschland nicht gen | stopped, right | a query measures another market (reviewer) |
| PohlCon GmbH | Baustoffe und Bausysteme | fail | In KI-Antworten werden Sie bei 4 von 8 Fragen in Deutschland nicht gen | stopped, right | profile wrong (reviewer) |
| TEUPEN Maschinenbau GmbH | Hersteller von Arbeitsbühnen | fail | Bei 4 von 5 Suchanfragen in Deutschland werden Sie heute nicht gefunde | stopped, right | no or one competitor; other (see message) |
| WICKERT Maschinenbau GmbH | Sondermaschinenbau Pressen | fail | Bei 4 von 5 Suchanfragen in Deutschland werden Sie heute nicht gefunde | stopped, right | market held by portals; a query measures another market (reviewer); a portal among the competitors |
| DELABO.GROUP GmbH | Dentallabor | fail | In KI-Antworten werden Sie bei 3 von 8 Fragen in Düsseldorf, Pinneberg | false fail | profile wrong (reviewer); a query measures another market (reviewer) |
| HÖLSCHER HOLDING GMBH | Lagertechnik und Logistikstahlbau | fail | Bei 6 von 6 Suchanfragen in Deutschland werden Sie heute nicht gefunde | false fail | a query measures another market (reviewer) |
| Optical Sorting GmbH | Kunststoffsortierung | fail | In KI-Antworten werden Sie bei 4 von 4 Fragen in Deutschland nicht gen | false fail | a query measures another market (reviewer) |
| Schwaben-Kunststoff Chemietank- und Apparatebau GmbH & Co. KG | Chemietank- und Apparatebau | fail | In KI-Antworten werden Sie bei 2 von 4 Fragen in Deutschland nicht gen | false fail | a query measures another market (reviewer) |
| SBS Technik GmbH | Krandienstleistung | pass_with_notes | In KI-Antworten werden Sie bei 4 von 4 Fragen in Deutschland nicht gen | FALSE PASS | |
| Geiger Hoch- und Tiefbau GmbH & Co. KG | Hoch- und Tiefbau | pass | In KI-Antworten werden Sie bei 2 von 6 Fragen in Oberstdorf nicht gena | pass, but nothing to say | |
| adeor medical AG | Medizintechnik | fail | Bei 4 von 4 Suchanfragen in Deutschland werden Sie heute nicht gefunde | holdout, not judged yet | no blocking finding recorded |
| cobos Fluid Service GmbH | Industrielles Abwassermanagement | pass_with_notes | In KI-Antworten werden Sie bei 2 von 6 Fragen in München, Dachau und G | holdout, not judged yet | |
| HDG - Verpackungsmaschinen GmbH | Verpackungsmaschinen | fail | (none) | holdout, not judged yet | no hook: found everywhere, nothing to open the conversation with |
| KARL SCHNELL GMBH & CO. KG | Maschinenbau für Lebensmittelindustrie | fail | (none) | holdout, not judged yet | no hook: found everywhere, nothing to open the conversation with; hook and rows disagree |
| Klaassen Technologie GmbH | Sondermaschinenbau und Automatisierungstechnik | fail | In KI-Antworten werden Sie bei 3 von 3 Fragen in Deutschland nicht gen | holdout, not judged yet | technical line implausible |
| RATEC GmbH | Schalungstechnik für Betonfertigteilwerke | fail | (none) | holdout, not judged yet | no hook: found everywhere, nothing to open the conversation with; other (see message) |
| SARTORIUS Werkzeuge GmbH & Co. KG | Werkzeughandel Zerspanung | pass | Bei 3 von 4 Suchanfragen in Deutschland werden Sie heute nicht gefunde | holdout, not judged yet | |
| Schulz+Partner GmbH | Verfahrenstechnik Anlagenbau | fail | In KI-Antworten werden Sie bei 4 von 6 Fragen in Deutschland nicht gen | holdout, not judged yet | market held by portals; a query measures another market (reviewer) |
| Wassermann + Kress Metallverarbeitung GmbH | CNC-Fertigung / Metallverarbeitung | pass_with_notes | In KI-Antworten werden Sie bei 7 von 7 Fragen in Deutschland nicht gen | holdout, not judged yet | |
| WFN AG Werkzeug- und Feinmechanik AG | Werkzeug- und Formenbau | pass | In KI-Antworten werden Sie bei 8 von 11 Fragen in der Schweiz nicht ge | holdout, not judged yet |
The same table, with every file behind it, is in the repo under eval/visibility-check/2026-09-02/ (README first). Every company has its profile, raw data, gate records, review rounds and the human judgement there.
Change one thing, run the eval, read the report, keep or revert. Never tune on a single company.
prospect_check.py). A wrong judgement about an entity or a mention is a prompt problem (check_review.py). A wrong number is a lint problem. Rules catch what is deterministic; prompts judge the grey.PROMPT_VERSION. Rule edits get a line in docs/PROSPECT-CHECK.md with the company that caused them.rejudge.py for the per-company sheet: kept and dropped terms, the hook, every row, every competitor with its evidence, the verdict.# on the VPS, in /root/ck-test (venv of the app)
python -m tool.reports.check_eval --subjects subjects.json --out eval/run-1 --stage derive --record --replay-gates --concurrency 8
python -m tool.reports.check_eval --subjects subjects.json --out eval/run-1 --stage review --record --replay-gates --concurrency 8
python -m tool.reports.check_eval --subjects subjects.json --out eval/run-1 --stage report
python rejudge.py eval/run-1 sbs-technik # one company, the sheet a reviewer reads
python -m tool.test_check_review # 100 unit checks, no network, no database
Stages: collect buys data (only after a research change, with --reuse-serp), derive runs gate 2 and the numbers, review runs the lint and gate 3, report writes report.<model>.md and models.md. --model runs any OpenRouter model on the same prompts; --repeat 2 measures how often a verdict flips.
| What | Where |
|---|---|
| Pipeline (site, profile, research, market test, numbers, status) | tool/reports/prospect_check.py |
| Gates, prompts, lint, actions, review cycle | tool/reports/check_review.py |
| Eval runner and report | tool/reports/check_eval.py |
| Unit checks | tool/test_check_review.py |
| Welcome form (the prospect's answers, locked fields) | tool/forms/schema.py, tool/forms/routes.py |
| Cockpit card (protocol, force-release, hold) | frontend/src/components/sales/check-card.tsx |
| Customer page | frontend/src/components/portal/check.tsx |
| Documentation, rules with their stories, release model | docs/PROSPECT-CHECK.md |
| Eval data, gold, reports, model challenge | VPS /root/ck-test/ (subjects, eval/run-1/<company>/, models.md) |
| Slack alerts for pages that need a person | Omni1 bot, env OMNI1_SLACK_BOT_TOKEN and OMNI1_SLACK_ALERT_CHANNEL |
Deploys go through the two doors described in Two-Door Deploys: frontend without database access, backend with dump and rollback. The eval never touches the production database; tests force SQLite when a Postgres DSN is in the environment.
OMNI1_CHECK_AUTO_RELEASE). Until then every page goes through the cockpit.