Numen on Google Cloud - Architecture on Google Cloud

Functional and technical views · drawn from the deployed sandbox numen-gcp-sandbox, updated 2026-09-07

Two diagrams of the same system. The functional view is what a researcher experiences and is the one to open a conversation with. The technical view names the services, identities and data paths behind it. Everything drawn here exists and is deployed; a short list of what is not yet built is at the end, kept deliberately separate so the diagrams cannot be read as aspirational.

Looking for the Google Cloud services by name? The technical view below is the shape of the system. The service-level architecture names every Google Cloud product in the deployment, what it is doing, what it costs, and which are absent on purpose - built for a cloud architect reviewing the design rather than a researcher using the product.

1 · Functional architecture

What a scientist does, and what Numen does in return. No cloud service names - this is the product, not the plumbing.

THE RESEARCHER'S PATH 1 · Sign in Pick an account. Role decides what you may do. 2 · Choose applications 9 tiles, 92 tools. Tick what the science needs. 3 · See size and cost Machine sized for you, priced before you commit. 4 · Launch Built and installed for you. Progress is per application. 5 · Work, then stop Desktop or shell. Idle timeout is your choice; billing stops with it. ALONGSIDE, AT EVERY STEP Ask-lepios (assistant) Answers from this platform's own data - the live catalogue, live Google Cloud prices, your real instances, and install times measured from real runs. Not from general knowledge. Every answer says what it rests on - including when it does not. Plan by workload "1M particles in 10 hours" becomes a machine, a node count and an hourly cost. Cost, before and after Every screen shows what it costs. The run rate is visible while work is running, and a spend report reconciles against the bill. Idle machines stop themselves, so nothing quietly accrues after the person who launched it has gone home. WHERE THE DATA LIVES - THREE TIERS, CHOSEN BY WHAT THE WORK NEEDS Your files Upload in the browser; the same files appear on every machine you launch, at /data. No copying step. Right for inputs and results. The machine's own disk Fast local storage that lives and dies with the instance. Right for scratch and temporary work. Shared filesystem Managed Lustre or Filestore, mounted at /scratch on one machine or on every cluster node. Pick one that exists, or create it. Cross-node read/write proven 3 Sept. FOUR WAYS TO RUN, ONE FRONT DOOR One machine - desktop or shell A cluster - up to 8 groups, CPU or GPU A batch job - fire and forget A container job - Kubernetes, Autopilot
The researcher never names a machine type, writes a template, or files a ticket. Numen turns a choice of applications into a costed, running environment, and takes it away again when it is idle.
The path a person takes Intelligence and planning Cost and data Ways to run

2 · Technical architecture

The same system, named. Every box below is a deployed resource in numen-gcp-sandbox.

Browser Static frontend, no build step Global HTTPS LB numen-gcp.clovertex.net Google-managed cert VPC numen-sandbox-vpc · NO EXTERNAL IPs · IAP-ONLY INGRESS · CLOUD NAT EGRESS numen-sandbox-web · e2-standard-2 nginx - frontend, /guide, /architecture gunicorn 4 workers × 4 threads -> Django (70 endpoints) sessions: signed cookies, no database runs as sa-numen-controller Infrastructure Manager · Cloud Build IM: one Terraform deployment per single node Cloud Build: cluster apply / add group / destroy from packaged Cluster Toolkit blueprints both run as sa-terraform COMPUTE LANES Single node - Compute Engine startup script -> installer -> per-app install proof · idle-stop agent Cluster - Slurm via Cluster Toolkit, from the console head node + up to 8 compute groups (CPU/GPU); nodes appear per job, gone 5 min after Batch - Cloud Batch ephemeral tasks, results to the outputs bucket · Spot or on-demand · per lab project Container - GKE Autopilot (Kubernetes Jobs) apps with a maintained image; outputs bucket mounted; log read back through the API STORAGE Per-user buckets + per-user identity numen-gcp-sandbox-u-<user>, one each mounted at /data by gcsfuse on the VM a VM can reach exactly one bucket - its own /scratch: Managed Lustre or Filestore, optional PLATFORM SERVICES THE WEBAPP CALLS DIRECTLY Vertex AI - assistant Gemini 2.5 Flash (us-central1), production Claude on Vertex retained, fallback off 16 tools over this platform's own data, incl. launch diagnosis Cloud Billing Catalog live list prices - every figure the UI shows is looked up, not hardcoded billing export reconciles actual spend Secret Manager Slurm DB password, QA password, OIDC client secret - added out-of-band, never in Terraform state or git Cloud Logging + guest attributes install proof published per app, so the UI shows what really installed without anyone opening an SSH session IDENTITIES - ONE PER JOB, NOT ONE FOR EVERYTHING sa-numen-controller the webapp · sa-terraform builds infrastructure · sa-numen-u-<user> one per researcher, what their VMs run as · sa-numen-slurm cluster nodes Separation is the isolation story: a launched VM holds a credential that can reach that user's bucket and nothing else. OPERATIONS - WATCHED EVERY NIGHT, DEPLOYED UNDER A LOCK Cloud Scheduler -> Cloud Build runs the assistant's golden conversations against the live site at 02:00 ET; result to GCS, Monitoring alert on failure · Cloud SQL keeps Slurm accounting after clusters are gone · deploys take a GCS lock and restart in place
Ingress is IAP-only and no launched instance has a public address unless a remote desktop was explicitly requested. Egress is through Cloud NAT.

Added between 3 and 7 September

Each row is deployed and was proven live on the day it says; the deploy guide Part is the record.

CapabilityWhat it is, in this systemPart
Lab projects (tenancy, two slices) A Google Cloud project per lab under the platform: its own VPC, NAT, Terraform and runtime service accounts (an org policy forbids cross-project accounts). Single-node launches and Batch jobs run in the lab as its own identities; quota, inventory, compliance findings and spend are read per project; an admin Projects panel shows lanes, machines, jobs, quota, findings and spend side by side. VPC Service Controls was evaluated and deliberately left for later: a project per tenant first. 50, 54
Developer view and Help Docs served from the repository itself (uploaded by Terraform on every deploy): the deploy guide, a build journal generated from it, a diary, the backlog, the tracker of Google's asks, the evaluations. A feature ledger with an author mark per entry. 48-50
RHEL 9 and Rocky 9 A launch-time OS choice beside Ubuntu: a dnf layer in the installer, 79 of 90 apps proven ready by an audit the catalogue pins, the launcher refusing the rest by name. 51
Spot at launch A checkbox with the Spot price and the saving shown against on-demand, from the Billing Catalog's Spot SKUs; the machine stops rather than dies on preemption. 53
Google's recommendations The Recommender API read per project - idle machines, machine types, idle disks and addresses, commitments, IAM - with the monthly saving and a Stop button for machines Numen owns. Read-only. 55
Real science, recorded Seurat on 10x PBMC 3k (Ubuntu and RHEL) and AlphaFold (ColabFold) on an L4 - real data, timed, hashed, read back, and written as job evidence the planner and the assistant use. The AlphaFold proof found an installer defect the install proof had reported as READY for weeks; the recipe is pinned and READY now means the model imports. 52, 56
Launch diagnosis "Why did my install fail?" answered without a shell: the deployment's Terraform error, the VM, the bootstrap's own verdicts and the serial-console log, matched against nineteen known signatures, each with a fix. A Diagnose button, an endpoint, and an assistant tool that explains the findings and is told never to invent a cause. 57
Container lane on GKE One regional Autopilot cluster; a catalogue app with a maintained image (Seurat, GROMACS) runs as a Kubernetes Job submitted through the API server with the webapp's own IAM token - no kubectl, no kubeconfig - with the outputs bucket mounted and the container log read back. Appears in My instances like any other lane. 59
Web host e2-standard-2 with four threaded gunicorn workers; the console's polling had saturated two synchronous workers on an e2-small and the front door answered 502. 58, 59

What happens on one launch

#StepWho does it
1Applications chosen; machine sized and priced against live list pricesDjango + Billing Catalog
2Disk headroom checked before submitting - a launch that cannot fit is refused, not started and failed 2 minutes laterDjango
3Identity and bucket derived from the session, never from the request bodyDjango
4Deployment created, blueprint pulled from the assets bucketInfrastructure Manager as sa-terraform
5Instance boots as sa-numen-u-<user>; gcsfuse mounts that user's bucket at /datastartup script
6Installer runs; each application publishes a version string as proofinstaller -> guest attributes
7Idle-stop armed with the timeout the user chose (30, 60 or 90 min, or none), counted only once the machine is Running - no logged-in user, no open session and no loadsystemd timer on the VM
8If a shared filesystem was chosen, Lustre or Filestore is mounted at the mount point given (default /scratch); the on-mount validator writes its report under <mount>/numen-validate/startup script

Security model in four lines

3 · Where the numbers come from

A recurring question, so it is worth stating plainly. Numen shows three kinds of number and does not blur them:

KindSourceExample
LiveCloud Billing Catalog, read at request time$0.268/hr for an e2-standard-8
MeasuredRecorded from real runs on this platforminstall minutes per application; job throughput
LearnedThe optimisation engine, trained on this site's own job accountingruntime for a workload no one here has run yet
DemonstrationThe engine trained on the built-in synthetic sample - shown, never presented as measuredwhat a new site sees before ingesting its own data
EstimatedDerived, and labelled as such in the UI and by the assistanttime to process a workload not yet observed
Every answer carries its basis, and they are strictly ranked: this site's own measured runs outrank the engine, which outranks a seed estimate. A model trained on the synthetic sample is capped at low confidence however good its metrics look. The assistant states which of these it is using. This is the foundation for feeding recommendations from accumulated real runs rather than from a model's general knowledge - the direction of travel, not a claim about today.

4 · Honest gaps

Kept separate from the diagrams so neither can be misread as complete. Revised 2026-09-03; entries closed since August are recorded as such rather than quietly deleted.

Closed since the 3 September version of this page

Closed since the August version of this page

Numen on Google Cloud · Clovertex · generated from the deployed sandbox, updated 2026-09-07