example.lrs.amtechhq.com / lead-routing-system

Seven services, and what a browser with no credential can actually see of them

This site demonstrates lead-routing-system against the deployment that is running right now. It is not a description of the platform. Where something can be exercised from a public page it is exercised on that page, live, and you can watch it happen. Where it cannot, the page says why instead of showing you a number somebody made up.

The rule this site is built on

A demonstration that shows invented data is worth less than one that says this needs an operator login, because the first teaches you to distrust everything else on the page. So there are three kinds of thing here and they are always labelled:

KindWhat it meansWhere you will see it
live This page made the request while you were looking at it and is showing you the answer. The whole of the fraud page, and the status board below.
recorded A transcript of a command that was actually run, kept verbatim so you can run it yourself and compare. Every curl block on every page.
from source A fact read out of the repository — a migration, a route table, a design decision. True about the code; it does not claim to be the live database's current contents. Rule tables, route lists, status notes.

There is a fourth kind, and you will not find it here: a plausible-looking number standing in for one this page could not read.

Live status — checked when you loaded this page

Every service answers GET /api/<name>/health with no credential. Almost none of them let a browser on this origin read the answer, and the board below tells the two apart rather than blurring them.

ServiceHealth routeWhat this browser observed
platformplatform.lrs.amtechhq.com/api/platform/health not asked
corpuscorpus.lrs.amtechhq.com/api/corpus/health not asked
marketplacemarketplace.lrs.amtechhq.com/api/marketplace/health not asked
routingrouting.lrs.amtechhq.com/api/routing/health not asked
fraudfraud.lrs.amtechhq.com/api/fraud/health not asked
smssms.lrs.amtechhq.com/api/sms/health not asked
proxyproxy.lrs.amtechhq.com/api/proxy/health not asked

The four answers, and why there are four

The third state is the normal one here, and it is a configuration choice rather than a fault. A health route exists for the deploy's health-checked auto-revert and for monitoring, not for a stranger's web page, so it publishes no CORS header.

There is one way out of it and this page already tries it: before going cross-origin, each row asks /health/<service> on this host. Nothing serves that path by default — this site is static files — so the attempt 404s and the row falls back. If whoever deploys this site adds the small nginx proxy in the repository's README.md, the same rows start reading real status codes and real bodies with no change to any page. The note under each badge says which path answered, because the service says it is up and our own vhost says the service says it is up are not quite the same sentence.

Exactly one surface in the whole platform is CORS-enabled on purpose, because it has to run inside a browser on a third party's page: fraud's /collect boundary. That is why the fraud page is the one that genuinely works and the other six are honest about their limits.

Verify it without a browser — recorded 2026-09-06

$ for s in platform corpus marketplace routing fraud sms proxy; do
    printf '%-12s ' "$s"
    curl -s -m 10 "https://$s.lrs.amtechhq.com/api/$s/health"; echo
  done
platform     {"service":"platform","status":"ok"}
corpus       {"service":"corpus","status":"ok"}
marketplace  {"service":"marketplace","status":"ok"}
routing      {"status":"ok","service":"routing"}
fraud        {"media":"writable","service":"fraud","status":"ok"}
sms          {"service":"sms","status":"ok"}
proxy        {"service":"proxy","status":"ok"}

curl is not a browser and is bound by no same-origin policy, which is the whole of the difference between this transcript and the board above.

The seven

Status wording is taken from platform/docs/ROADMAP.md, which is the status document of record. Where this site and that file disagree, that file is right.

Why they are seven and not one

One MySQL instance, one schema per service, and two database users each — and no service user holds any privilege on another service's schema. A cross-schema query is not discouraged here, it is impossible: no REFERENCES grant, so a cross-schema foreign key cannot even be created, and no SHOW DATABASES. Services talk over HTTP or they do not talk.

That has a cost and the platform pays it openly: reporting is eventually consistent, which is why the API envelope carries a meta.stale field. It also has a consequence you can see on the fraud page — fraud records the seller campaign key it is told and cannot verify it, because the list of campaigns that ought to exist lives in marketplace and fraud may not read marketplace's schema.