{
  "version": "1.0",
  "generated_at": "2026-05-26",
  "repo": "growth",
  "notes": "One-shot structural ontology of the growth monorepo. Source of truth is the schema in docs/ontology/schema.md. Node IDs follow <type>:<slug>. Edges connect node IDs.",
  "stats": {
    "domains": 8,
    "platforms": 3,
    "services_total": 65,
    "services_top_level_deployable": 49,
    "services_nested_deployable": 43,
    "projects": 16,
    "languages": 7,
    "build_systems": 8,
    "ingress_domains": 8,
    "external_apis": 18
  },

  "nodes": [
    { "id": "repo:growth", "type": "Repo", "name": "growth", "path": "/", "purpose": "Multi-language Bazel monorepo spanning AI/ML, applied apps, microservices, peer-platforms, and infra" },

    { "id": "domain:infrastructure",  "type": "Domain", "name": "Infrastructure",   "path": "services/, common/infrastructure/", "purpose": "Cluster, ingress, identity, networking, observability, storage" },
    { "id": "domain:ai-ml",           "type": "Domain", "name": "AI / ML",          "path": "common/ai/, projects/llmserver/, projects/agents/, projects/deeptrainer/, projects/screenai/", "purpose": "AutoML, vision, LLM fine-tuning, agents, inference" },
    { "id": "domain:content-mmo",     "type": "Domain", "name": "Content / MMO",    "path": "mmo/", "purpose": "Fan-out video creation and multi-platform publishing" },
    { "id": "domain:trading-quant",   "type": "Domain", "name": "Trading / Quant",  "path": "quant/, projects/trader/, projects/forecasting/, projects/quant/, projects/vibecoding/quant/", "purpose": "Strategies, OMS, market data, backtests" },
    { "id": "domain:learning-lingua", "type": "Domain", "name": "Learning / Lingua","path": "lingua/", "purpose": "Cross-platform English study app + grader backend" },
    { "id": "domain:web-platforms",   "type": "Domain", "name": "Web Platforms",    "path": "projects/portfolio/, design/, app/, common/platforms/web/, common/platforms/cli/, common/platforms/desktop/", "purpose": "User-facing surfaces (web/CLI/desktop)" },
    { "id": "domain:dev-tooling",     "type": "Domain", "name": "Dev Tooling",      "path": "cc/, gateway/, projects/mcps/, projects/agents/mcp/, common/bazel/", "purpose": "CLI tools, MCP gateway, AI coding profile manager, build tooling" },
    { "id": "domain:research",        "type": "Domain", "name": "Research",         "path": "research/, study/", "purpose": "Experimental code, notebooks, one-off explorations" },

    { "id": "platform:mmo",    "type": "Platform", "name": "mmo",    "path": "mmo/",    "purpose": "Fan-out video posting (YouTube/TikTok/Meta/X/Pinterest) + AI generation (Sora/Veo/Gemini)", "namespace": "mmo",    "deploy": "skaffold run -p prod -f mmo/deploy/skaffold.yaml" },
    { "id": "platform:quant",  "type": "Platform", "name": "quant",  "path": "quant/",  "purpose": "Quantitative trading platform: ingest, strategies, OMS, risk, forecasting",        "namespace": "quant",  "deploy": "skaffold run -p prod -f quant/skaffold.yaml" },
    { "id": "platform:lingua", "type": "Platform", "name": "lingua", "path": "lingua/", "purpose": "Cross-platform English-study app + Go grader (uses mmo's geminiweb scraper)",      "namespace": "lingua", "deploy": "skaffold run -p prod -f lingua/web/deploy/skaffold.yaml" },

    { "id": "component:mmo/api",           "type": "Component", "name": "mmo/api",           "platform": "mmo",    "language": "go",         "purpose": "HTTP API: jobs, assets, accounts, projects, briefs, oauth state, campaigns" },
    { "id": "component:mmo/web",           "type": "Component", "name": "mmo/web",           "platform": "mmo",    "language": "typescript", "purpose": "Next.js 15 dashboard (compose, jobs, projects, connections)" },
    { "id": "component:mmo/flow-renderer", "type": "Component", "name": "mmo/flow-renderer", "platform": "mmo",    "language": "typescript", "purpose": "Flow studio rendering engine" },
    { "id": "component:mmo/src",           "type": "Component", "name": "mmo/src (CLI)",     "platform": "mmo",    "language": "python",     "purpose": "Python one-shot fan-out CLI + local auth helper" },
    { "id": "component:quant/api",         "type": "Component", "name": "quant/api",         "platform": "quant",  "language": "go",         "purpose": "Consolidated HTTP API: ingest + strategy + OMS + risk + forecaster + backtester" },
    { "id": "component:quant/web",         "type": "Component", "name": "quant/web",         "platform": "quant",  "language": "typescript", "purpose": "Next.js 15 trading dashboard" },
    { "id": "component:quant/agentic",     "type": "Component", "name": "quant/agentic",     "platform": "quant",  "language": "python",     "purpose": "Opt-in Python LLM trader (Anthropic Claude)" },
    { "id": "component:lingua/app",        "type": "Component", "name": "lingua/app",        "platform": "lingua", "language": "typescript", "purpose": "Expo Router cross-platform (iOS/Android/Web) study app" },
    { "id": "component:lingua/web",        "type": "Component", "name": "lingua/web",        "platform": "lingua", "language": "typescript", "purpose": "Static Expo Router export (nginx)" },
    { "id": "component:lingua/api",        "type": "Component", "name": "lingua/api",        "platform": "lingua", "language": "go",         "purpose": "Go grader; shells out to mmo's geminiweb script" },

    { "id": "service:9router",              "type": "Service", "name": "9router",              "path": "services/9router/",              "category": "ingress-platform",   "wraps": "custom",                            "language": "go" },
    { "id": "service:adguard",              "type": "Service", "name": "adguard",              "path": "services/adguard/",              "category": "dns-network",        "wraps": "adguard-home" },
    { "id": "service:airflow",              "type": "Service", "name": "airflow",              "path": "services/airflow/",              "category": "data-platform",      "wraps": "apache/airflow",                     "language": "python" },
    { "id": "service:argocd",               "type": "Service", "name": "argocd",               "path": "services/argocd/",               "category": "ci-cd",              "wraps": "argoproj/argo-cd" },
    { "id": "service:base",                 "type": "Service", "name": "base",                 "path": "services/base/",                 "category": "platform",           "wraps": "custom",                            "purpose": "Shared parent Helm chart extended by many services" },
    { "id": "service:cert-manager",         "type": "Service", "name": "cert-manager",         "path": "services/cert-manager/",         "category": "security-secrets",   "wraps": "jetstack/cert-manager" },
    { "id": "service:cilium",               "type": "Service", "name": "cilium",               "path": "services/cilium/",               "category": "dns-network",        "wraps": "cilium/cilium" },
    { "id": "service:external-dns",         "type": "Service", "name": "external-dns",         "path": "services/external-dns/",         "category": "dns-network",        "wraps": "kubernetes-sigs/external-dns" },
    { "id": "service:external-secrets",     "type": "Service", "name": "external-secrets",     "path": "services/external-secrets/",     "category": "security-secrets",   "wraps": "external-secrets-io" },
    { "id": "service:fluentd",              "type": "Service", "name": "fluentd",              "path": "services/fluentd/",              "category": "observability",      "wraps": "fluent/fluentd" },
    { "id": "service:github-runner",        "type": "Service", "name": "github-runner",        "path": "services/github-runner/",        "category": "ci-cd",              "wraps": "actions/actions-runner-controller", "notes": "Scaled min=1 max=10 on node `en` (2026-05-25 ops/scale-growth-runner)" },
    { "id": "service:goldilocks",           "type": "Service", "name": "goldilocks",           "path": "services/goldilocks/",           "category": "observability",      "wraps": "fairwinds/goldilocks" },
    { "id": "service:hass",                 "type": "Service", "name": "hass",                 "path": "services/hass/",                 "category": "automation",         "wraps": "home-assistant" },
    { "id": "service:headplane",            "type": "Service", "name": "headplane",            "path": "services/headplane/",            "category": "dns-network",        "wraps": "headplane",                          "purpose": "Headscale management UI" },
    { "id": "service:headscale",            "type": "Service", "name": "headscale",            "path": "services/headscale/",            "category": "dns-network",        "wraps": "headscale",                          "language": "go" },
    { "id": "service:hermes",               "type": "Service", "name": "hermes",               "path": "services/hermes/",               "category": "automation",         "wraps": "custom",                            "language": "python", "notes": "Caps must include DAC_OVERRIDE,FOWNER" },
    { "id": "service:httpd",                "type": "Service", "name": "httpd",                "path": "services/httpd/",                "category": "dev-tools",          "wraps": "apache/httpd" },
    { "id": "service:jellyfin",             "type": "Service", "name": "jellyfin",             "path": "services/jellyfin/",             "category": "media",              "wraps": "jellyfin",                          "language": "csharp" },
    { "id": "service:jenkins",              "type": "Service", "name": "jenkins",              "path": "services/jenkins/",              "category": "ci-cd",              "wraps": "jenkins/jenkins",                   "language": "java" },
    { "id": "service:jupyterhub",           "type": "Service", "name": "jupyterhub",           "path": "services/jupyterhub/",           "category": "ml-platform",        "wraps": "jupyterhub/jupyterhub",             "language": "python" },
    { "id": "service:k10",                  "type": "Service", "name": "k10",                  "path": "services/k10/",                  "category": "storage-backup",     "wraps": "kasten/k10" },
    { "id": "service:k8s",                  "type": "Service", "name": "k8s (dashboard)",      "path": "services/k8s/",                  "category": "dev-tools",          "wraps": "kubernetes/dashboard" },
    { "id": "service:karpenter",            "type": "Service", "name": "karpenter",            "path": "services/karpenter/",            "category": "ci-cd",              "wraps": "aws/karpenter" },
    { "id": "service:keycloak",             "type": "Service", "name": "keycloak",             "path": "services/keycloak/",             "category": "identity-auth",      "wraps": "bitnami/keycloak",                  "language": "java", "purpose": "OIDC/SAML provider; realm `mmo` fronts mmo platform" },
    { "id": "service:kube-prometheus-stack","type": "Service", "name": "kube-prometheus-stack","path": "services/kube-prometheus-stack/","category": "observability",      "wraps": "prometheus-community/kube-prometheus-stack" },
    { "id": "service:litellm",              "type": "Service", "name": "litellm",              "path": "services/litellm/",              "category": "llm-platform",       "wraps": "berriai/litellm",                   "language": "python", "purpose": "LLM API gateway" },
    { "id": "service:locust",               "type": "Service", "name": "locust",               "path": "services/locust/",               "category": "dev-tools",          "wraps": "locust",                            "language": "python" },
    { "id": "service:loki",                 "type": "Service", "name": "loki",                 "path": "services/loki/",                 "category": "observability",      "wraps": "grafana/loki" },
    { "id": "service:metabase",             "type": "Service", "name": "metabase",             "path": "services/metabase/",             "category": "dev-tools",          "wraps": "metabase",                          "language": "clojure" },
    { "id": "service:minio",                "type": "Service", "name": "minio",                "path": "services/minio/",                "category": "storage-backup",     "wraps": "minio/minio",                       "language": "go" },
    { "id": "service:mlflow",               "type": "Service", "name": "mlflow",               "path": "services/mlflow/",               "category": "ml-platform",        "wraps": "mlflow",                            "language": "python" },
    { "id": "service:n8n",                  "type": "Service", "name": "n8n",                  "path": "services/n8n/",                  "category": "automation",         "wraps": "n8n-io/n8n",                        "language": "nodejs" },
    { "id": "service:nextcloud",            "type": "Service", "name": "nextcloud",            "path": "services/nextcloud/",            "category": "productivity",       "wraps": "nextcloud",                         "language": "php" },
    { "id": "service:nginx",                "type": "Service", "name": "nginx",                "path": "services/nginx/",                "category": "ingress-platform",   "wraps": "kubernetes/ingress-nginx",          "notes": "Ingress class `nginx`. Pin ingress pods to thomas." },
    { "id": "service:oauth2-proxy-mmo",     "type": "Service", "name": "oauth2-proxy-mmo",     "path": "services/oauth2-proxy-mmo/",     "category": "identity-auth",      "wraps": "oauth2-proxy",                      "language": "go", "purpose": "OAuth2 reverse proxy gating mmo platform via keycloak" },
    { "id": "service:obsidian",             "type": "Service", "name": "obsidian",             "path": "services/obsidian/",             "category": "productivity",       "wraps": "obsidian-sync" },
    { "id": "service:ollama",               "type": "Service", "name": "ollama",               "path": "services/ollama/",               "category": "llm-platform",       "wraps": "ollama" },
    { "id": "service:omniroute",            "type": "Service", "name": "omniroute",            "path": "services/omniroute/",            "category": "llm-platform",       "wraps": "custom",                            "language": "go", "purpose": "In-cluster LLM proxy; rides Claude/Codex/Gemini subscriptions", "endpoint": "http://omniroute-base-template.default.svc.cluster.local:20128/v1" },
    { "id": "service:openclaw",             "type": "Service", "name": "openclaw",             "path": "services/openclaw/",             "category": "automation",         "wraps": "custom" },
    { "id": "service:openwebui",            "type": "Service", "name": "openwebui",            "path": "services/openwebui/",            "category": "llm-platform",       "wraps": "open-webui/open-webui",             "language": "python" },
    { "id": "service:pgadmin4",             "type": "Service", "name": "pgadmin4",             "path": "services/pgadmin4/",             "category": "dev-tools",          "wraps": "pgadmin4",                          "language": "python" },
    { "id": "service:portainer",            "type": "Service", "name": "portainer",            "path": "services/portainer/",            "category": "dev-tools",          "wraps": "portainer" },
    { "id": "service:rancher",              "type": "Service", "name": "rancher",              "path": "services/rancher/",              "category": "ci-cd",              "wraps": "rancher/rancher" },
    { "id": "service:ruflo",                "type": "Service", "name": "ruflo",                "path": "services/ruflo/",                "category": "automation",         "wraps": "custom",                            "language": "go", "purpose": "Custom workflow orchestrator; agent discoverer" },
    { "id": "service:tailscale",            "type": "Service", "name": "tailscale",            "path": "services/tailscale/",            "category": "dns-network",        "wraps": "tailscale" },
    { "id": "service:vault",                "type": "Service", "name": "vault",                "path": "services/vault/",                "category": "security-secrets",   "wraps": "hashicorp/vault",                   "language": "go" },
    { "id": "service:vpa",                  "type": "Service", "name": "vpa",                  "path": "services/vpa/",                  "category": "ci-cd",              "wraps": "fairwinds/vpa" },
    { "id": "service:wireguard",            "type": "Service", "name": "wireguard",            "path": "services/wireguard/",            "category": "dns-network",        "wraps": "wireguard" },
    { "id": "service:wordpress",            "type": "Service", "name": "wordpress",            "path": "services/wordpress/",            "category": "productivity",       "wraps": "wordpress",                         "language": "php" },

    { "id": "agg:bigdata",     "type": "ServiceGroup", "name": "bigdata",     "path": "services/bigdata/",     "members": ["flink", "spark", "zookeeper"] },
    { "id": "agg:cache",       "type": "ServiceGroup", "name": "cache",       "path": "services/cache/",       "members": ["memcached", "redis"] },
    { "id": "agg:database",    "type": "ServiceGroup", "name": "database",    "path": "services/database/",    "members": ["cassandra", "cockroach", "couchdb", "etcd", "hbase", "influxdb", "mariadb", "mongo", "mysql", "neo4j", "postgresql"] },
    { "id": "agg:development", "type": "ServiceGroup", "name": "development", "path": "services/development/", "members": ["cicd/argocd", "cicd/jenkins", "test", "tools/kaka", "tools/lala", "tools/templates"] },
    { "id": "agg:elk",         "type": "ServiceGroup", "name": "elk",         "path": "services/elk/",         "members": ["elasticsearch", "filebeat", "kibana", "logstash"] },
    { "id": "agg:mesh",        "type": "ServiceGroup", "name": "mesh",        "path": "services/mesh/",        "members": ["consul", "kong"] },
    { "id": "agg:messaging",   "type": "ServiceGroup", "name": "messaging",   "path": "services/messaging/",   "members": ["kafka"] },
    { "id": "agg:monitoring",  "type": "ServiceGroup", "name": "monitoring",  "path": "services/monitoring/",  "members": ["grafana", "kube-prometheus-stack", "prometheus", "sonarqube", "splunk", "superset"] },
    { "id": "agg:platform",    "type": "ServiceGroup", "name": "platform",    "path": "services/platform/",    "members": ["observability", "security/pod-security-standards"] },
    { "id": "agg:pubsub",      "type": "ServiceGroup", "name": "pubsub",      "path": "services/pubsub/",      "members": ["kafka", "rabbitmq"] },

    { "id": "project:agents",          "type": "Project", "name": "agents",          "path": "projects/agents/",          "language": "python",     "stack": "FastAPI+LangChain", "deployable": true,  "status": "active",        "purpose": "OpenAI-compatible multi-agent server with 12+ specialized agents", "subprojects": ["agi", "deepagent", "mcp", "tools"] },
    { "id": "project:agrvn",           "type": "Project", "name": "agrvn",           "path": "projects/agrvn/",           "language": "typescript", "stack": "React Native+Node", "deployable": false, "status": "active",        "purpose": "Vietnamese agricultural e-commerce platform", "subprojects": ["agrfrontend", "agrserver"] },
    { "id": "project:chat",            "type": "Project", "name": "chat",            "path": "projects/chat/",            "language": "python",     "stack": "FastAPI",           "deployable": true,  "status": "active",        "purpose": "Chat service wrapper with web UI" },
    { "id": "project:deeptrainer",     "type": "Project", "name": "deeptrainer",     "path": "projects/deeptrainer/",     "language": "python",     "stack": "HF Transformers",   "deployable": false, "status": "active",        "purpose": "Gemma/LLM fine-tuning and inference" },
    { "id": "project:forecasting",     "type": "Project", "name": "forecasting",     "path": "projects/forecasting/",     "language": "python",     "stack": "Jupyter",           "deployable": false, "status": "active",        "purpose": "Time-series financial forecasting" },
    { "id": "project:grow-loadtesting","type": "Project", "name": "grow-loadtesting","path": "projects/grow-loadtesting/","language": "polyglot",   "stack": "k6+Locust+proto",   "deployable": false, "status": "experimental",  "purpose": "Hybrid load testing harness" },
    { "id": "project:llmserver",       "type": "Project", "name": "llmserver",       "path": "projects/llmserver/",       "language": "python",     "stack": "vLLM",              "deployable": true,  "status": "active",        "purpose": "vLLM inference server wrapper" },
    { "id": "project:loadtest",        "type": "Project", "name": "loadtest",        "path": "projects/loadtest/",        "language": "python",     "stack": "Locust",            "deployable": false, "status": "abandoned",     "purpose": "Locust load testing client (stub)" },
    { "id": "project:mcps",            "type": "Project", "name": "mcps",            "path": "projects/mcps/",            "language": "python",     "stack": "FastMCP/Starlette", "deployable": false, "status": "active",        "purpose": "Model Context Protocol server implementations", "subprojects": ["broweruse", "postgres"] },
    { "id": "project:portfolio",       "type": "Project", "name": "portfolio",       "path": "projects/portfolio/",       "language": "typescript", "stack": "Next.js 15 + React 19","deployable": true,"status": "active",        "purpose": "Main Next.js dashboard / portfolio" },
    { "id": "project:quant-research",  "type": "Project", "name": "quant (research)","path": "projects/quant/",           "language": "python",     "stack": "Jupyter",           "deployable": false, "status": "experimental",  "purpose": "Quant research notebooks (separate from quant/ platform)" },
    { "id": "project:screenai",        "type": "Project", "name": "screenai",        "path": "projects/screenai/",        "language": "python",     "stack": "Telegram+vision LLM","deployable": false,"status": "abandoned",    "purpose": "Telegram screenshot analysis bot" },
    { "id": "project:telegrambot",     "type": "Project", "name": "telegrambot",     "path": "projects/telegrambot/",     "language": "python",     "stack": "python-telegram-bot","deployable": false,"status": "abandoned",    "purpose": "Minimal Telegram bot stub" },
    { "id": "project:trader",          "type": "Project", "name": "trader",          "path": "projects/trader/",          "language": "polyglot",   "stack": "Python+Next.js+PG", "deployable": false, "status": "active",        "purpose": "Vietnam-stock end-to-end trading platform (ingestion→ML→backtest→web)" },
    { "id": "project:vibecoding",      "type": "Project", "name": "vibecoding",      "path": "projects/vibecoding/",      "language": "python",     "stack": "Jupyter",           "deployable": false, "status": "experimental",  "purpose": "Vibe-coding utilities and quant algorithm scratch" },
    { "id": "project:workflow",        "type": "Project", "name": "workflow",        "path": "projects/workflow/",        "language": "python",     "stack": "Telegram+OpenUI",   "deployable": true,  "status": "active",        "purpose": "Telegram bot + LLM orchestration with OpenUI/Deepseek" },

    { "id": "standalone:cc",      "type": "Standalone", "name": "cc (ccm)",  "path": "cc/",      "language": "rust+typescript", "purpose": "Rust CLI managing profiles for Claude Code / Codex / Gemini CLI / Copilot", "deployable": "cargo install" },
    { "id": "standalone:gateway", "type": "Standalone", "name": "gateway",   "path": "gateway/", "language": "rust",            "purpose": "Federating MCP server + policy engine + control-plane API (crates: gateway-core, gateway-policy, gateway-api, gateway-mcp, gw-cli)", "deployable": "skaffold (gateway/deploy/)" },
    { "id": "standalone:design",  "type": "Standalone", "name": "design",    "path": "design/",  "language": "typescript",      "purpose": "Next.js 16 design hub (auto-indexes public/library and content/library)", "deployable": "Docker → Helm → design.toandaominh1997.com" },
    { "id": "standalone:resume",  "type": "Standalone", "name": "resume",    "path": "resume/",  "language": "latex",           "purpose": "Single-source LaTeX resume (tectonic / Docker pdflatex)", "deployable": "GitHub Actions builds PDF" },
    { "id": "standalone:app",     "type": "Standalone", "name": "app (stub)","path": "app/",     "language": "typescript",      "purpose": "Empty Next.js scaffold; no content yet", "deployable": false },

    { "id": "lib:common/ai",             "type": "Library", "name": "common/ai",             "path": "common/ai/",             "purpose": "AutoML, computer vision, LLM fine-tuning, ML pipelines", "language": "python" },
    { "id": "lib:common/bazel",          "type": "Library", "name": "common/bazel",          "path": "common/bazel/",          "purpose": "Bazel rule extensions and configs",                       "language": "starlark" },
    { "id": "lib:common/infrastructure", "type": "Library", "name": "common/infrastructure", "path": "common/infrastructure/", "purpose": "Terraform (provisioning) + Ansible (config mgmt)" },
    { "id": "lib:common/main",           "type": "Library", "name": "common/main",           "path": "common/main/",           "purpose": "Production code organized by language: python/go/java/cc/rust/scala/kotlin/js/proto" },
    { "id": "lib:common/platforms",      "type": "Library", "name": "common/platforms",      "path": "common/platforms/",      "purpose": "Web / desktop / CLI end-user surfaces" },
    { "id": "lib:common/proto",          "type": "Library", "name": "common/proto",          "path": "common/proto/",          "purpose": "Protocol Buffer definitions" },
    { "id": "lib:common/scripts",        "type": "Library", "name": "common/scripts",        "path": "common/scripts/",        "purpose": "Utility/automation scripts" },
    { "id": "lib:common/src",            "type": "Library", "name": "common/src",            "path": "common/src/",            "purpose": "Shared utilities (logger, flags, timeit, locust base, etc.)" },
    { "id": "lib:common/test",           "type": "Library", "name": "common/test",           "path": "common/test/",           "purpose": "Test code for python/java/cc/scala" },

    { "id": "lang:python",     "type": "Language", "name": "Python 3.12",     "manager": "uv" },
    { "id": "lang:go",         "type": "Language", "name": "Go 1.23",         "manager": "go-modules" },
    { "id": "lang:typescript", "type": "Language", "name": "TypeScript / JS", "manager": "pnpm",        "runtime": "Node 20" },
    { "id": "lang:rust",       "type": "Language", "name": "Rust 1.75",       "manager": "cargo" },
    { "id": "lang:jvm",        "type": "Language", "name": "JVM (Java/Scala/Kotlin)", "manager": "rules_jvm_external" },
    { "id": "lang:cpp",        "type": "Language", "name": "C++17",           "manager": "bazel-cc" },
    { "id": "lang:starlark",   "type": "Language", "name": "Starlark",        "manager": "bazel" },

    { "id": "build:bazel",      "type": "BuildSystem", "name": "Bazel 8.2+ bzlmod", "purpose": "Source-of-truth build for in-Bazel code; excludes mmo/quant/lingua" },
    { "id": "build:pnpm",       "type": "BuildSystem", "name": "pnpm",              "purpose": "Root JS workspace; projects/portfolio has its own lockfile" },
    { "id": "build:uv",         "type": "BuildSystem", "name": "uv",                "purpose": "Python workspace (root pyproject.toml)" },
    { "id": "build:cargo",      "type": "BuildSystem", "name": "Cargo",             "purpose": "Rust workspace (root Cargo.toml + Cargo.Bazel.lock)" },
    { "id": "build:go-modules", "type": "BuildSystem", "name": "Go modules + Gazelle", "purpose": "Go deps; Gazelle generates BUILD files" },
    { "id": "build:skaffold",   "type": "BuildSystem", "name": "Skaffold",          "purpose": "Build + Helm-deploy each services/ + platform unit" },
    { "id": "build:helm",       "type": "BuildSystem", "name": "Helm",              "purpose": "Chart packaging; services/base/ is a shared parent chart" },
    { "id": "build:make",       "type": "BuildSystem", "name": "Make",              "purpose": "Local entrypoint for mmo/, quant/" },

    { "id": "datastore:postgres-cnpg", "type": "DataStore", "name": "Postgres (CNPG)", "purpose": "Shared cluster Postgres operator-managed; mmo/quant/portfolio/trader all use it", "namespace": "postgres" },
    { "id": "datastore:redis",         "type": "DataStore", "name": "Redis",           "purpose": "Shared cache; quant uses it for risk counters" },
    { "id": "datastore:minio",         "type": "DataStore", "name": "MinIO S3",        "purpose": "S3-compatible object storage" },
    { "id": "datastore:asyncstorage",  "type": "DataStore", "name": "AsyncStorage",    "purpose": "On-device React Native storage (lingua app)" },

    { "id": "ingress:mmo.toandaominh1997.com",      "type": "IngressDomain", "name": "mmo.toandaominh1997.com",      "behind": "oauth2-proxy-mmo + keycloak realm `mmo`" },
    { "id": "ingress:mmo-api.toandaominh1997.com",  "type": "IngressDomain", "name": "mmo-api.toandaominh1997.com",  "behind": "oauth2-proxy-mmo + keycloak realm `mmo`" },
    { "id": "ingress:quant.toandaominh1997.com",    "type": "IngressDomain", "name": "quant.toandaominh1997.com" },
    { "id": "ingress:quant-api.toandaominh1997.com","type": "IngressDomain", "name": "quant-api.toandaominh1997.com" },
    { "id": "ingress:lingua.toandaominh1997.com",   "type": "IngressDomain", "name": "lingua.toandaominh1997.com" },
    { "id": "ingress:design.toandaominh1997.com",   "type": "IngressDomain", "name": "design.toandaominh1997.com" },

    { "id": "ext:youtube",        "type": "ExternalAPI", "name": "YouTube Data v3" },
    { "id": "ext:tiktok",         "type": "ExternalAPI", "name": "TikTok Content API" },
    { "id": "ext:meta",           "type": "ExternalAPI", "name": "Meta Graph (FB/Instagram)" },
    { "id": "ext:x",              "type": "ExternalAPI", "name": "X (Twitter) API" },
    { "id": "ext:pinterest",      "type": "ExternalAPI", "name": "Pinterest API" },
    { "id": "ext:openai-sora",    "type": "ExternalAPI", "name": "OpenAI / Sora" },
    { "id": "ext:google-veo",     "type": "ExternalAPI", "name": "Google Veo (Flow)" },
    { "id": "ext:gemini-web",     "type": "ExternalAPI", "name": "Gemini Advanced (web scraper)", "auth": "Playwright + /u/7 work account" },
    { "id": "ext:anthropic",      "type": "ExternalAPI", "name": "Anthropic Claude API" },
    { "id": "ext:hf",             "type": "ExternalAPI", "name": "HuggingFace" },
    { "id": "ext:fireworks",      "type": "ExternalAPI", "name": "Fireworks" },
    { "id": "ext:bluesky",        "type": "ExternalAPI", "name": "Bluesky" },
    { "id": "ext:yt-dlp",         "type": "ExternalAPI", "name": "yt-dlp (TikTok/YouTube ingest)" },
    { "id": "ext:binance",        "type": "ExternalAPI", "name": "Binance (testnet)" },
    { "id": "ext:alpaca",         "type": "ExternalAPI", "name": "Alpaca paper / IEX" },
    { "id": "ext:ibkr",           "type": "ExternalAPI", "name": "Interactive Brokers Client Portal" },
    { "id": "ext:vn-venues",      "type": "ExternalAPI", "name": "VietDirect / SSI / VietCap" },
    { "id": "ext:cloudflare",     "type": "ExternalAPI", "name": "Cloudflare (DNS for toandaominh1997.com)" },

    { "id": "cluster:phuck3s", "type": "Cluster", "name": "phuck3s", "purpose": "Primary self-hosted Kubernetes cluster" },
    { "id": "node:thomas",     "type": "Node",    "name": "thomas",  "cluster": "phuck3s", "role": "Primary ingress node (pin ingress workloads here)" },
    { "id": "node:en",         "type": "Node",    "name": "en",      "cluster": "phuck3s", "role": "CoreDNS / kube-dns + github-runner pool" },
    { "id": "node:mch-mcp",    "type": "Node",    "name": "mch-mcp", "cluster": "phuck3s", "role": "Auxiliary" },

    { "id": "concept:layered-deploy",     "type": "Concept", "name": "Layered deploy",     "purpose": "Path-based filtering in .github/workflows/deploy.yml with `plan` job gating 5 deploy layers" },
    { "id": "concept:omniroute-routing",  "type": "Concept", "name": "Omniroute routing",  "purpose": "In-cluster services route LLM traffic via the omniroute proxy, never direct to api.anthropic.com" },
    { "id": "concept:oauth2-keycloak",    "type": "Concept", "name": "OAuth2 → Keycloak",  "purpose": "mmo platform: oauth2-proxy gates ingress; Keycloak realm `mmo` federates Google IdP" },
    { "id": "concept:helm-base-chart",    "type": "Concept", "name": "services/base parent chart", "purpose": "Many services extend services/base/ for consistent deployment template" },
    { "id": "concept:bazel-first",        "type": "Concept", "name": "Bazel-first multi-language", "purpose": "Bazel is source of truth except for mmo/quant/lingua/ which use native toolchains" },
    { "id": "concept:test-tags",          "type": "Concept", "name": "Test tag semantics", "purpose": "`manual` and `integration` tags keep slow/expensive tests opt-in" }
  ],

  "edges": [
    { "from": "repo:growth", "to": "domain:infrastructure",  "type": "contains" },
    { "from": "repo:growth", "to": "domain:ai-ml",           "type": "contains" },
    { "from": "repo:growth", "to": "domain:content-mmo",     "type": "contains" },
    { "from": "repo:growth", "to": "domain:trading-quant",   "type": "contains" },
    { "from": "repo:growth", "to": "domain:learning-lingua", "type": "contains" },
    { "from": "repo:growth", "to": "domain:web-platforms",   "type": "contains" },
    { "from": "repo:growth", "to": "domain:dev-tooling",     "type": "contains" },
    { "from": "repo:growth", "to": "domain:research",        "type": "contains" },

    { "from": "domain:content-mmo",     "to": "platform:mmo",    "type": "contains" },
    { "from": "domain:trading-quant",   "to": "platform:quant",  "type": "contains" },
    { "from": "domain:learning-lingua", "to": "platform:lingua", "type": "contains" },

    { "from": "platform:mmo",    "to": "component:mmo/api",           "type": "contains" },
    { "from": "platform:mmo",    "to": "component:mmo/web",           "type": "contains" },
    { "from": "platform:mmo",    "to": "component:mmo/flow-renderer", "type": "contains" },
    { "from": "platform:mmo",    "to": "component:mmo/src",           "type": "contains" },
    { "from": "platform:quant",  "to": "component:quant/api",         "type": "contains" },
    { "from": "platform:quant",  "to": "component:quant/web",         "type": "contains" },
    { "from": "platform:quant",  "to": "component:quant/agentic",     "type": "contains" },
    { "from": "platform:lingua", "to": "component:lingua/app",        "type": "contains" },
    { "from": "platform:lingua", "to": "component:lingua/web",        "type": "contains" },
    { "from": "platform:lingua", "to": "component:lingua/api",        "type": "contains" },

    { "from": "component:mmo/api",       "to": "lang:go",         "type": "written_in" },
    { "from": "component:mmo/web",       "to": "lang:typescript", "type": "written_in" },
    { "from": "component:mmo/flow-renderer","to":"lang:typescript","type": "written_in" },
    { "from": "component:mmo/src",       "to": "lang:python",     "type": "written_in" },
    { "from": "component:quant/api",     "to": "lang:go",         "type": "written_in" },
    { "from": "component:quant/web",     "to": "lang:typescript", "type": "written_in" },
    { "from": "component:quant/agentic", "to": "lang:python",     "type": "written_in" },
    { "from": "component:lingua/app",    "to": "lang:typescript", "type": "written_in" },
    { "from": "component:lingua/web",    "to": "lang:typescript", "type": "written_in" },
    { "from": "component:lingua/api",    "to": "lang:go",         "type": "written_in" },

    { "from": "component:mmo/api",       "to": "build:go-modules", "type": "built_by" },
    { "from": "component:mmo/web",       "to": "build:pnpm",       "type": "built_by" },
    { "from": "component:quant/api",     "to": "build:go-modules", "type": "built_by" },
    { "from": "component:quant/web",     "to": "build:pnpm",       "type": "built_by" },
    { "from": "component:quant/agentic", "to": "build:uv",         "type": "built_by" },
    { "from": "platform:mmo",            "to": "build:skaffold",   "type": "deploys_via" },
    { "from": "platform:quant",          "to": "build:skaffold",   "type": "deploys_via" },
    { "from": "platform:lingua",         "to": "build:skaffold",   "type": "deploys_via" },
    { "from": "platform:mmo",            "to": "build:make",       "type": "built_by" },
    { "from": "platform:quant",          "to": "build:make",       "type": "built_by" },

    { "from": "component:mmo/api",       "to": "datastore:postgres-cnpg", "type": "uses_datastore" },
    { "from": "component:quant/api",     "to": "datastore:postgres-cnpg", "type": "uses_datastore" },
    { "from": "component:quant/api",     "to": "datastore:redis",         "type": "uses_datastore" },
    { "from": "component:lingua/app",    "to": "datastore:asyncstorage",  "type": "uses_datastore" },

    { "from": "component:mmo/api",     "to": "ingress:mmo-api.toandaominh1997.com",   "type": "exposes" },
    { "from": "component:mmo/web",     "to": "ingress:mmo.toandaominh1997.com",       "type": "exposes" },
    { "from": "component:quant/api",   "to": "ingress:quant-api.toandaominh1997.com", "type": "exposes" },
    { "from": "component:quant/web",   "to": "ingress:quant.toandaominh1997.com",     "type": "exposes" },
    { "from": "component:lingua/web",  "to": "ingress:lingua.toandaominh1997.com",    "type": "exposes" },
    { "from": "standalone:design",     "to": "ingress:design.toandaominh1997.com",    "type": "exposes" },

    { "from": "ingress:mmo.toandaominh1997.com",     "to": "service:oauth2-proxy-mmo", "type": "auth_via" },
    { "from": "ingress:mmo-api.toandaominh1997.com", "to": "service:oauth2-proxy-mmo", "type": "auth_via" },
    { "from": "service:oauth2-proxy-mmo",            "to": "service:keycloak",         "type": "auth_via" },

    { "from": "component:mmo/api",     "to": "ext:youtube",     "type": "integrates_with" },
    { "from": "component:mmo/api",     "to": "ext:tiktok",      "type": "integrates_with" },
    { "from": "component:mmo/api",     "to": "ext:meta",        "type": "integrates_with" },
    { "from": "component:mmo/api",     "to": "ext:x",           "type": "integrates_with" },
    { "from": "component:mmo/api",     "to": "ext:pinterest",   "type": "integrates_with" },
    { "from": "component:mmo/api",     "to": "ext:openai-sora", "type": "integrates_with" },
    { "from": "component:mmo/api",     "to": "ext:google-veo",  "type": "integrates_with" },
    { "from": "component:mmo/api",     "to": "ext:gemini-web",  "type": "integrates_with" },
    { "from": "component:mmo/api",     "to": "ext:hf",          "type": "integrates_with" },
    { "from": "component:mmo/api",     "to": "ext:fireworks",   "type": "integrates_with" },
    { "from": "component:mmo/api",     "to": "ext:bluesky",     "type": "integrates_with" },
    { "from": "component:mmo/api",     "to": "ext:yt-dlp",      "type": "integrates_with" },
    { "from": "component:quant/api",   "to": "ext:binance",     "type": "integrates_with" },
    { "from": "component:quant/api",   "to": "ext:alpaca",      "type": "integrates_with" },
    { "from": "component:quant/api",   "to": "ext:ibkr",        "type": "integrates_with" },
    { "from": "component:quant/api",   "to": "ext:vn-venues",   "type": "integrates_with" },
    { "from": "component:quant/agentic","to":"ext:anthropic",   "type": "integrates_with" },
    { "from": "component:lingua/api",  "to": "ext:gemini-web",  "type": "integrates_with" },
    { "from": "component:lingua/api",  "to": "component:mmo/api","type": "depends_on", "notes": "shells out to mmo/api/internal/sources/scripts/gemini_web.py" },

    { "from": "component:mmo/api",     "to": "service:omniroute", "type": "routes_through" },
    { "from": "component:quant/api",   "to": "service:omniroute", "type": "routes_through" },
    { "from": "project:agents",        "to": "service:omniroute", "type": "routes_through" },
    { "from": "project:workflow",      "to": "service:omniroute", "type": "routes_through" },

    { "from": "service:nginx",   "to": "node:thomas", "type": "pinned_to" },

    { "from": "domain:infrastructure", "to": "service:9router",              "type": "contains" },
    { "from": "domain:infrastructure", "to": "service:adguard",              "type": "contains" },
    { "from": "domain:infrastructure", "to": "service:argocd",               "type": "contains" },
    { "from": "domain:infrastructure", "to": "service:base",                 "type": "contains" },
    { "from": "domain:infrastructure", "to": "service:cert-manager",         "type": "contains" },
    { "from": "domain:infrastructure", "to": "service:cilium",               "type": "contains" },
    { "from": "domain:infrastructure", "to": "service:external-dns",         "type": "contains" },
    { "from": "domain:infrastructure", "to": "service:external-secrets",     "type": "contains" },
    { "from": "domain:infrastructure", "to": "service:fluentd",              "type": "contains" },
    { "from": "domain:infrastructure", "to": "service:github-runner",        "type": "contains" },
    { "from": "domain:infrastructure", "to": "service:goldilocks",           "type": "contains" },
    { "from": "domain:infrastructure", "to": "service:headplane",            "type": "contains" },
    { "from": "domain:infrastructure", "to": "service:headscale",            "type": "contains" },
    { "from": "domain:infrastructure", "to": "service:k10",                  "type": "contains" },
    { "from": "domain:infrastructure", "to": "service:k8s",                  "type": "contains" },
    { "from": "domain:infrastructure", "to": "service:karpenter",            "type": "contains" },
    { "from": "domain:infrastructure", "to": "service:keycloak",             "type": "contains" },
    { "from": "domain:infrastructure", "to": "service:kube-prometheus-stack","type": "contains" },
    { "from": "domain:infrastructure", "to": "service:loki",                 "type": "contains" },
    { "from": "domain:infrastructure", "to": "service:minio",                "type": "contains" },
    { "from": "domain:infrastructure", "to": "service:nginx",                "type": "contains" },
    { "from": "domain:infrastructure", "to": "service:oauth2-proxy-mmo",     "type": "contains" },
    { "from": "domain:infrastructure", "to": "service:portainer",            "type": "contains" },
    { "from": "domain:infrastructure", "to": "service:rancher",              "type": "contains" },
    { "from": "domain:infrastructure", "to": "service:tailscale",            "type": "contains" },
    { "from": "domain:infrastructure", "to": "service:vault",                "type": "contains" },
    { "from": "domain:infrastructure", "to": "service:vpa",                  "type": "contains" },
    { "from": "domain:infrastructure", "to": "service:wireguard",            "type": "contains" },
    { "from": "domain:infrastructure", "to": "service:hermes",               "type": "contains" },

    { "from": "domain:ai-ml", "to": "service:airflow",     "type": "contains" },
    { "from": "domain:ai-ml", "to": "service:jupyterhub",  "type": "contains" },
    { "from": "domain:ai-ml", "to": "service:mlflow",      "type": "contains" },
    { "from": "domain:ai-ml", "to": "service:ollama",      "type": "contains" },
    { "from": "domain:ai-ml", "to": "service:litellm",     "type": "contains" },
    { "from": "domain:ai-ml", "to": "service:omniroute",   "type": "contains" },
    { "from": "domain:ai-ml", "to": "service:openwebui",   "type": "contains" },
    { "from": "domain:ai-ml", "to": "project:agents",      "type": "contains" },
    { "from": "domain:ai-ml", "to": "project:deeptrainer", "type": "contains" },
    { "from": "domain:ai-ml", "to": "project:llmserver",   "type": "contains" },
    { "from": "domain:ai-ml", "to": "project:screenai",    "type": "contains" },
    { "from": "domain:ai-ml", "to": "project:workflow",    "type": "contains" },
    { "from": "domain:ai-ml", "to": "lib:common/ai",       "type": "contains" },

    { "from": "domain:trading-quant", "to": "project:trader",         "type": "contains" },
    { "from": "domain:trading-quant", "to": "project:forecasting",    "type": "contains" },
    { "from": "domain:trading-quant", "to": "project:quant-research", "type": "contains" },
    { "from": "domain:trading-quant", "to": "project:vibecoding",     "type": "contains" },

    { "from": "domain:web-platforms", "to": "project:portfolio",       "type": "contains" },
    { "from": "domain:web-platforms", "to": "standalone:design",       "type": "contains" },
    { "from": "domain:web-platforms", "to": "lib:common/platforms",    "type": "contains" },
    { "from": "domain:web-platforms", "to": "standalone:app",          "type": "contains" },
    { "from": "domain:web-platforms", "to": "project:agrvn",           "type": "contains" },

    { "from": "domain:dev-tooling", "to": "standalone:cc",      "type": "contains" },
    { "from": "domain:dev-tooling", "to": "standalone:gateway", "type": "contains" },
    { "from": "domain:dev-tooling", "to": "project:mcps",       "type": "contains" },
    { "from": "domain:dev-tooling", "to": "lib:common/bazel",   "type": "contains" },
    { "from": "domain:dev-tooling", "to": "service:jenkins",    "type": "contains" },
    { "from": "domain:dev-tooling", "to": "service:metabase",   "type": "contains" },
    { "from": "domain:dev-tooling", "to": "service:pgadmin4",   "type": "contains" },
    { "from": "domain:dev-tooling", "to": "service:locust",     "type": "contains" },
    { "from": "domain:dev-tooling", "to": "project:grow-loadtesting","type":"contains" },
    { "from": "domain:dev-tooling", "to": "project:loadtest",   "type": "contains" },
    { "from": "domain:dev-tooling", "to": "project:telegrambot","type": "contains" },
    { "from": "domain:dev-tooling", "to": "project:chat",       "type": "contains" }
  ]
}
