# Studio tech stack — SINGLE SOURCE OF TRUTH (component inventory) # Loop: edit this file → python3 scripts/generate-wiki.py → /wiki/ + docs/wiki/* # Track TECH_STACK.md files are narrative only (link here; do not duplicate rows). # Runtime may enrich version fields at generate time. # # Schema per item: # id, name, version, role # layer: 1|2|3 # track: studio-infra|studio-engine|studio-design|studio-products # industry: shared mental map (Layers section headers · Technology accordions) # kind / subkind: retained for tooling; not Technology top-level nav # machine: oracle|vast|both|host|n/a # status: wired|installed|planned|removed|deferred|installed-not-wired # product_id: (products) registry id # uds_route / uds_routes: script name(s) in studio_platform/andi/uds_daemon.py route_request # path | version_from | compose_service: codebase evidence (required when status: wired) # meta: title: Venture Studio Tech Stack description: >- SSOT inventory. Wiki Layers = track tables + industry headers; Technology = industry tables (+ Track). Narrative lives in track TECH_STACK.md. last_reviewed: '2026-10-22' kinds: - id: compute-runtime label: Compute & runtime blurb: Hosts, containers, warm workers, GPU path - id: data-memory label: Data & memory blurb: Stores, caches, graphs, vectors - id: api-app label: API & app platform blurb: HTTP APIs, workers, MCP, app shells - id: design-system label: Design system blurb: '@studio/ui kit, tokens, templates' - id: llm-nlp label: LLM & NLP blurb: Gateways, local models, clinical sensors - id: symbolic-formal label: Symbolic & formal blurb: Solvers and probabilistic logic - id: science-pack label: Causal · probabilistic · GNN blurb: andi312 / Vast science coprocessors - id: trust-observability label: Trust & observability blurb: Calibration, drift, eval, tracing - id: healthcare-io label: Healthcare I/O blurb: Validation boundary & streams - id: security-pqc label: Security & PQC blurb: Auth contracts and post-quantum - id: product label: Products blurb: User-facing surfaces on the platform layers: - id: 1 title: Infrastructure track_primary: studio-infra blurb: Foundation — VM, data plane, networking - id: 2 title: Platform tracks: - studio-engine - studio-design blurb: Engine, ANDI, LLM lanes, design kit - id: 3 title: Products track_primary: studio-products blurb: What users see — one row per product items: - id: docker-postgres name: TimescaleDB / Postgres version: 2.28.2-pg16 role: Primary relational + time-series layer: 1 track: studio-infra kind: data-memory subkind: relational machine: oracle status: wired industry: infra-data compose_service: postgres - id: docker-redis name: Redis version: 7-alpine role: Cache, queues, Vast bridge cache (db2) layer: 1 track: studio-infra kind: data-memory subkind: cache machine: oracle status: wired industry: infra-data compose_service: redis - id: docker-qdrant name: Qdrant version: latest role: Vector memory (dense + BM25 sparse hybrid on every collection) layer: 1 track: studio-infra kind: data-memory subkind: vector machine: oracle status: wired industry: infra-data compose_service: qdrant evidence: "bm25 sparse vector on all collections via scripts/qdrant-enable-hybrid.py; hybrid_query in studio_platform/shared/rag/bm25.py" - id: studio-falkordb name: FalkorDB version: latest role: Graph database for agent memory and entity relationships (Cypher queries) layer: 1 track: studio-infra kind: data subkind: graph-db machine: oracle status: wired industry: infra-data compose_service: studio-falkordb note: >- data at /data/falkordb; port 6381; graph engine ready for new agent memory work. Does not yet back Graphiti — Neo4j remains the temporal store. - id: neo4j name: Neo4j version: 5-community role: Graph store for Graphiti temporal memory (episodes, entity edges, valid_at/invalid_at) layer: 1 track: studio-infra kind: data-memory subkind: graph machine: oracle status: removed note: >- Removed from docker-compose.yml after FalkorDB migration complete. studio-memory temporal store now uses Redis (redis://127.0.0.1:6381, ready: true). No Python code depends on Neo4j bolt port 7687. industry: infra-data compose_service: neo4j evidence: "Container not running; removed from docker-compose.yml; studio-memory temporal migrated to FalkorDB/Redis" - id: docker-litellm-cache name: LiteLLM semantic cache Redis version: 8-alpine role: RediSearch index for LiteLLM redis-semantic cache (local embeddings via Ollama bge-m3); isolated from studio-redis job store layer: 1 track: studio-infra kind: data-memory subkind: cache machine: oracle status: wired industry: infra-data compose_service: litellm-cache path: studio_platform/litellm/config.yaml - id: docker-litellm name: LiteLLM version: main-latest role: Inference gateway / lane routing / semantic response cache layer: 1 track: studio-infra kind: llm-nlp subkind: gateway machine: oracle status: wired industry: infra-llm path: docs/operations/LITELLM_ONE_GATEWAY.md evidence: "studio_platform/litellm/config.yaml — litellm_settings.cache: true (type: redis-semantic, threshold 0.85, redis://localhost:6380); tier/confidential-fast, tier/confidential-deep, tier/critical set no-cache + no-store" - id: docker-ollama name: Ollama (container) version: latest role: Local confidential / fallback models layer: 1 track: studio-infra kind: llm-nlp subkind: local-runtime machine: oracle status: removed removal_date: '2026-10-22' industry: infra-llm note: >- REMOVED 2026-10-22 → replaced by llama-chat.service (:11435), llama-embed.service (:11436) and ollama-compat.service (:11434). Freed the 7.01 GB `ollama/ollama:latest` image. The 3.31 GB `ollama_speed_storage` volume was KEPT — /data/models/qwen3.5-4b.gguf is a symlink into it (already dangling: its blob is absent). Pre-removal history: the 3 GiB cap made the cgroup OOM-kill llama-server (kernel: oom-kill:constraint=CONSTRAINT_MEMCG … task=llama-server) → "model runner has unexpectedly stopped" → LiteLLM cooled down `local-qwen3-1.7b` → AstraBot 500 "No deployments available for selected model"; raised 3g → 8g on 2026-10-21, now moot. NOTE: this migration freed DISK only. Measured RAM with qwen3:1.7b loaded: Ollama 1.84 GiB vs llama.cpp 2.6 GB — Ollama's cgroup swap was 1 MB, so it was never the swap culprit. - id: ollama-qwen25 name: qwen2.5 instruct (Ollama) version: 1.5b/3b role: Local fallback chat layer: 1 track: studio-infra kind: llm-nlp subkind: local-model machine: oracle status: removed removal_date: '2026-10-22' industry: infra-llm note: >- No 1.5b/3b tag was ever present in the model cache and no code references one (only commented-out examples in astra .env.example). Removed with the Ollama container; the qwen2.5 knobs remain as comments only. - id: ollama-qwen3 name: qwen3 (llama.cpp) version: 1.7b Q4_K_M role: Local fallback chat layer: 1 track: studio-infra kind: llm-nlp subkind: local-model machine: oracle status: wired industry: infra-llm path: infra/systemd/llama-chat.service evidence: "migrated to llama-chat.service (:11435) — GGUF /data/models/qwen3-1.7b.gguf; 0.6b requests are aliased to the same backend" note: >- 2026-10-22: migrated from Ollama to llama.cpp llama-server (b11804, built from source — the released ARM64 binary needs GLIBC_2.38, host has 2.35). qwen3:0.6b is no longer a separate backend: the ollama-compat shim aliases it to this server. Serving config: ctx 8192 / 2 slots (4096 each) / q8_0 KV, measured RSS ~2.6 GB, MemoryMax=3G. - id: ollama-bge-m3 name: bge-m3 (llama.cpp) version: F16 role: Local embeddings layer: 1 track: studio-infra kind: llm-nlp subkind: embed machine: oracle status: wired industry: infra-llm path: infra/systemd/llama-embed.service evidence: "migrated to llama-embed.service (:11436) — GGUF /data/models/bge-m3.gguf, --embd-normalize -1" note: >- Vectors are bit-identical to the previous Ollama output (verified max abs diff 0.0) thanks to --embd-normalize -1, so Qdrant collections memory/nous/studio (Cosine, 1024-dim) need no re-embedding. - id: llama-chat name: llama.cpp chat server version: b11804 (0.7.0-dev) role: Local fallback chat (qwen3-1.7b), OpenAI-compatible layer: 1 track: studio-infra kind: llm-nlp subkind: local-runtime machine: oracle status: wired industry: infra-llm path: infra/systemd/llama-chat.service version_from: /usr/local/bin/llama-server --version evidence: "127.0.0.1:11435 /v1/chat/completions; LiteLLM local-qwen3-1.7b → openai/qwen3-1.7b; ctx 4096/1 slot, q8_0 KV, mem ~1.5G / cap 2G" note: >- 2026-10-22 (sizing): ctx 8192/2 slots → 4096/1 slot, MemoryMax 3G → 2G, KV stays q8_0. Per-request context is unchanged at 4096 tokens (`--ctx-size` is the total pool, divided by `--parallel`); concurrency drops 2 → 1. Measured: cgroup anon 1.31 GB (≤1.66 GB incl. model page cache), 0 throttle events, 0 OOM. RSS 2.3 GB — RSS also counts the shared 1.36 GB weight file, which is not charged to this cgroup, so RSS cannot reach 1.0-1.2 GB at Q4_K_M; the cgroup number is the one the caps police. q4_0 KV was trialled and rejected: 1.20 GB working set but ~16% slower on 3k prefill (140s vs 130s) and a reproducible leading `` on long prompts (2/2 runs; q8_0 clean). `--batch-size`/`--ubatch-size` reduction was trialled and dropped: 0 MB gain, weight file dominates — not worth the complexity. MemoryHigh must stay above the working set — at 1200M the cgroup livelocked (251k `high` events, memory PSI 78%, 3k-token prompt timed out); shipped 1800M. - id: llama-embed name: llama.cpp embedding server version: b11804 (0.7.0-dev) role: Local embeddings (bge-m3), OpenAI-compatible layer: 1 track: studio-infra kind: llm-nlp subkind: embed machine: oracle status: wired industry: infra-llm path: infra/systemd/llama-embed.service version_from: /usr/local/bin/llama-server --version evidence: "127.0.0.1:11436 /v1/embeddings; LiteLLM local-bge-m3 → openai/bge-m3" - id: ollama-compat name: Ollama-compatible API shim version: '1.0' role: Keeps Ollama-native /api/* callers working on top of llama.cpp layer: 1 track: studio-infra kind: llm-nlp subkind: local-runtime machine: oracle status: wired industry: infra-llm path: scripts/ollama_compat_shim.py evidence: "127.0.0.1:11434 /api/{tags,ps,chat,generate,embeddings,embed} → llama-chat :11435 / llama-embed :11436" note: >- 42 call sites in 23 modules call Ollama's native API (astrabot, nous, casevault, astra, athena, studio_platform) and 10 systemd units export OLLAMA_URL. The shim binds the same :11434 so none of them changed. Maps `think: false` → chat_template_kwargs.enable_thinking=false (without it qwen3 returns empty content) and `format` → response_format. - id: bge-reranker name: BGE-reranker-v2-m3 version: latest role: Cross-encoder reranker for RAG (top-50 -> top-5) layer: 2 track: studio-engine kind: llm-nlp subkind: rerank machine: oracle status: wired industry: app-tooling uds_route: rerank path: studio_platform/shared/rag/reranker.py - id: docling name: Docling (IBM) version: latest role: Document extraction (PDF/DOCX -> structured markdown, tables) layer: 2 track: studio-engine kind: tooling subkind: document-parser machine: oracle status: wired industry: app-tooling path: studio_platform/shared/rag/docling_extract.py - id: gliner name: GLiNER version: mediumv2.1 role: Zero-shot NER for ingested documents layer: 2 track: studio-engine kind: llm-nlp subkind: ner machine: oracle status: wired industry: app-tooling path: studio_platform/shared/rag/gliner_ner.py - id: docker-n8n name: n8n version: latest role: Workflow automation layer: 1 track: studio-infra kind: compute-runtime subkind: automation machine: oracle status: wired industry: infra-ops compose_service: n8n - id: docker-openhands name: OpenHands version: '0.38' role: Coding agent runtime — retired 2026-10-31 (container removed; only GET / health probes for weeks) layer: 1 track: studio-infra kind: compute-runtime subkind: agent-runtime machine: oracle status: retired industry: infra-ops path: docs/operations/SYSTEM_INVENTORY.md evidence: "studio-openhands stopped + rm 2026-10-31 (up 3 days, only GET / probes). nous andi_pipeline openhands path degrades to the local subprocess fallback; workspace /home/ubuntu/studio/infra/openhands-workspace retained" - id: docker-langfuse name: Langfuse stack version: '3' role: LLM + route observability — retired 2026-10-31 (0 traces in 24 h); MLflow remains the live trace sink layer: 1 track: studio-infra kind: trust-observability subkind: tracing machine: oracle status: retired industry: infra-ops path: docker-compose.yml evidence: "Containers studio-langfuse{,-clickhouse,-minio,-worker,-redis} stopped + rm 2026-10-31; images removed. Data volumes /data/langfuse-* kept. Telemetry is fail-open (studio_platform/shared/telemetry/langfuse_http.py drops on outage); scripts/setup-langfuse-v3-stack.sh can recreate the stack" - id: nginx name: nginx version: system role: Public reverse proxy; docs routes fixed for casevault + prophunt (2026-10-23) — proxy_pass to backend /docs (FastAPI serves docs at /docs, not /api/docs) layer: 1 track: studio-infra kind: compute-runtime subkind: edge machine: oracle status: wired industry: infra-compute path: docs/nginx-studio-venky.conf - id: systemd-platform name: Platform systemd units version: host role: nginx, fastapi, studio-frontend/console/shell/wiki/mcp/job-worker, andi-uds, registry product units layer: 1 track: studio-infra kind: compute-runtime subkind: process-manager machine: oracle status: wired industry: infra-compute path: AGENTS.md - id: host-swap-tuning name: Host swap + VM memory tuning version: host role: /swapfile (4GB, fstab) + /etc/sysctl.d/99-studio.conf — vm.swappiness=10 and vm.vfs_cache_pressure=50 applied 2026-10-23 to stop swap thrash layer: 1 track: studio-infra kind: compute-runtime subkind: memory-tuning machine: oracle status: wired industry: infra-compute path: infra/sysctl/99-studio.conf - id: multi-agent-coordination name: Multi-agent prod-lane coordination version: host role: Advisory flock on /run/lock/studio-prod-lane.lock (scripts/lib/prod-lock.sh) + guarded destructive ops (scripts/lib/prod-ops.sh, scripts/prod-op.sh); STUDIO_AGENT identity, dynamic agent count via who, conflicts logged to /var/log/studio-prod-lock.log + syslog. Enforcement hardened — sudo audit policy active (/etc/sudoers.d/studio-prod-ops, log_output → /var/log/sudo-studio.log), PASSWD gating intentionally not active (ubuntu password locked) layer: 1 track: studio-infra kind: compute-runtime subkind: coordination machine: oracle status: wired industry: infra-compute path: scripts/lib/prod-lock.sh - id: agent-parity-guards name: Agent parity contract + lane guards version: '1' role: "One operative contract (docs/operations/AGENT_LANE_CONTRACT.md) mirrored by scripts/ruleSync.js into .cursor/rules/, .opencode/rules/ and .clinerules/ (Cline 4.x cannot parse .mdc or .cursorrules). Mechanical guards share one deny table (scripts/lib/agent_command_rules.py): .clinerules/hooks/PreToolUse + TaskStart + UserPromptSubmit (Cline), .cursor/hooks/prod-lane-guard (Cursor beforeShellExecution), infra/git-hooks/pre-push (all tools); prod-lane scripts (promote-batch/promote-product/deploy-product/restart-prod-services/block2/block3) call require_human_prod_lane (exit 78). Identity via STUDIO_AGENT. CI gate: scripts/validate-agent-parity.sh" layer: 1 track: studio-infra kind: compute-runtime subkind: coordination machine: oracle status: wired industry: infra-compute path: docs/operations/AGENT_LANE_CONTRACT.md evidence: "scripts/validate-agent-parity.sh PASS — ruleSync mirrors, Cline hook self-tests (blocks promote-batch/sudo, allows develop push + block1), pre-push refuses refs/heads/main, .clineignore docs/ policy, guard wired in 6 scripts; status-agents.sh reports CONTRACT/HOOK/GUARD=yes for opencode, cursor and cline; root cause of prior drift: all 10 recorded Cline sessions had a 4,593-char system prompt with no # Rules section" - id: prod-enforcement-root-wrapper name: Prod enforcement via root-owned wrapper (Option B) version: planned role: PLANNED — dedicated maintenance window only. Install a root-owned non-user-writable dispatcher (/usr/local/sbin/studio-prod-op, root:root 0755), remove `ubuntu ALL=(ALL) NOPASSWD:ALL` from /etc/sudoers.d/90-cloud-init-users, then grant NOPASSWD only on the dispatcher. This is the only variant that actually closes the bypass — the advisory lock plus sudo audit cannot stop `sudo bash -c`, and a NOPASSWD rule on the repo wrapper would be an escalation because that file is ubuntu-owned. Requires rewriting the 34 `sudo systemctl` call sites in deploy/install/CI scripts. Do not apply during normal operations; sudoers mistakes lock out all root access. - id: studio-weekly-swap-reclaim name: Weekly swap reclaim cron wrapper version: host role: Weekly `swapoff -a && swapon -a` reclaim run under the prod lock with a RAM guard (refuses if MemAvailable < SwapUsed + 2 GiB). Installed at /usr/local/bin/studio-weekly-swap-reclaim.sh, crontab entry 0 3 * * 0. layer: 1 track: studio-infra kind: compute-runtime subkind: memory-tuning machine: oracle status: wired industry: infra-compute path: infra/scripts/studio-weekly-swap-reclaim.sh - id: install-host-maintenance name: Host maintenance install script version: host role: Post-rebuild / fresh-VM install of host-level maintenance scripts not managed by systemd or Docker (weekly swap reclaim, logrotate studio config, /var/log/studio permissions). layer: 1 track: studio-infra kind: compute-runtime subkind: bootstrapping machine: oracle status: wired industry: infra-compute path: infra/scripts/install-host-maintenance.sh - id: vast-gpu name: Vast GPU instance version: remote role: Warm bridges + vLLM (Machine 2) layer: 1 track: studio-infra kind: compute-runtime subkind: gpu machine: vast status: wired industry: infra-compute path: studio_platform/andi/vast_router.py - id: andi-uds name: ANDI UDS daemon version: andi312 role: Warm science process `/tmp/andi_causal.sock` layer: 1 track: studio-infra kind: compute-runtime subkind: warm-worker machine: oracle status: wired industry: infra-compute path: studio_platform/andi/uds_daemon.py - id: fastapi name: FastAPI version: 0.141.1 role: Studio API surface; evidence-tier enforcement middleware active at /api/studio/pipeline/* boundary (returns 400 on invalid tier, adds X-Evidence-Tier header on valid responses) layer: 2 track: studio-engine kind: api-app subkind: http machine: host status: wired industry: app-tooling path: studio_platform/jobs/routes.py - id: uvicorn name: Uvicorn version: 0.52.3 role: ASGI server (legacy) — no host systemd service uses it as of 2026-10-23; remains only inside Docker images (astra-cos API :8001, MLflow, OpenHands) layer: 2 track: studio-engine kind: api-app subkind: http machine: host status: wired industry: inference-serving path: api/main.py - id: granian name: Granian version: 2.8.5 role: ASGI server (Rust) — all host ASGI services (fastapi, casevault-backend, prophunt-api, athena-backend, nous-backend, astrabot-backend, atlas); migration complete 2026-10-23 layer: 2 track: studio-engine kind: api-app subkind: http machine: host status: wired industry: inference-serving path: utilities/astrabot/atlas/main.py - id: pydantic name: Pydantic version: 2.13.4 role: Request/response contracts layer: 2 track: studio-engine kind: api-app subkind: validation machine: host status: wired industry: app-tooling path: studio_platform/requirements-gate.txt - id: llm-brain name: llm_brain + llm_policy version: platform role: Product LLM entry + lane policy layer: 2 track: studio-engine kind: llm-nlp subkind: policy machine: host status: wired industry: agent-orchestration path: studio_platform/shared/llm_brain.py - id: langgraph name: LangGraph version: 1.2.11 role: Agent graphs layer: 2 track: studio-engine kind: api-app subkind: agents machine: host status: wired industry: agent-orchestration path: studio_platform/agents/graph.py - id: temporal name: Temporal version: 1.23.1 role: Durable workflows — Temporal server (studio-postgres, temporal + temporal_visibility DBs) + stub worker on studio-default queue layer: 2 track: studio-engine kind: api-app subkind: workflows machine: host status: wired industry: agent-orchestration path: studio_platform/temporal/worker.py compose_service: studio-temporal note: docker studio-temporal on 127.0.0.1:7233 (auto-setup, SKIP_DB_CREATE=false); ui on 127.0.0.1:8088; worker systemd studio-temporal-worker.service; SDK temporalio 1.34.0 - id: calibration-workflow name: CalibrationWorkflow version: 1.0.0 role: 'Weekly Brier score + evidently drift + tier promotion gate via Temporal' layer: 2 track: studio-engine kind: api-app subkind: workflows machine: host status: wired industry: agent-orchestration uds_route: null path: studio_platform/temporal/workflows/calibration_workflow.py note: 'schedule: calibration-weekly (every 7 days); task queue studio-tasks' - id: register-schedules name: register-schedules version: 1.0.0 role: 'One-time Temporal schedule registration script' layer: 2 track: studio-engine kind: api-app subkind: workflows machine: host status: wired industry: agent-orchestration path: studio_platform/temporal/register_schedules.py - id: studio-mcp name: Studio MCP version: platform role: Tooling MCP server layer: 2 track: studio-engine kind: api-app subkind: mcp machine: host status: wired industry: app-tooling path: studio_platform/shared/mcp/server.py - id: contextforge name: IBM ContextForge MCP Gateway version: latest role: Single MCP source of truth — server lifecycle, registry, credentials, and virtual-server composition layer: 2 track: studio-engine kind: api-app subkind: mcp-gateway machine: oracle status: wired industry: app-tooling path: scripts/ensure-contextforge.sh evidence: "Docker container contextforge on host network (:4444); Postgres mcp DB; gateways composio-email-1/2; virtual servers studio-email (12 Composio Gmail/Outlook tools) and studio-andi (6 ANDI UDS routes via AstraBot /andi/{route}); AstraBot spawner/marketplace/vault retired (P3, 2026-10-21); SSRF_ALLOW_LOCALHOST=true + UAID_ALLOWED_DOMAINS=studio-venky.duckdns.org + GUNICORN_WORKERS=3 (2026-10-21); studio-andi tools recreated with absolute url (the P2 bootstrap wrote url=\"None\" → every call failed 'Outbound URL blocked by URL policy')" note: >- scripts/ensure-contextforge.sh owns the container (env file ~/.config/studio/contextforge.env, no secrets in git); scripts/ensure-contextforge-andi-tools.sh owns the studio-andi REST tools (url/baseUrl/pathTemplate for each ANDI route). - id: job-worker name: studio-job-worker version: platform role: Async job queue consumer layer: 2 track: studio-engine kind: api-app subkind: workers machine: host status: wired industry: app-tooling path: studio_platform/jobs/worker.py - id: vast-router name: vast_router version: platform role: Shared Vast bridge + Redis cache layer: 2 track: studio-engine kind: compute-runtime subkind: gpu-bridge machine: both status: wired industry: inference-serving uds_route: vast_route path: studio_platform/andi/vast_router.py - id: vllm-qwen name: vLLM · Qwen3.5-4B-GPTQ-MTP version: vast-http role: Primary confidential LLM (served id qwen3-4b) layer: 2 track: studio-engine kind: llm-nlp subkind: serving machine: vast status: wired industry: inference-serving path: studio_platform/andi/vast_runtime/start_vllm.sh evidence: "ilyu/Qwen3.5-4B-GPTQ-MTP via vLLM 0.31 + MTP-1; LiteLLM cloud-qwen3-4b*" - id: clinicalbert name: ClinicalBERT version: oracle role: Fast token NER (<50ms) layer: 2 track: studio-engine kind: llm-nlp subkind: sensor machine: oracle status: wired industry: causal-clinical path: studio_platform/andi/uds_daemon.py - id: sapbert name: SapBERT (ONNX) version: oracle role: Clinical synonym → SNOMED/LOINC layer: 2 track: studio-engine kind: llm-nlp subkind: sensor machine: oracle status: wired industry: causal-clinical uds_route: sapbert_normalize path: studio_platform/andi/sapbert_normalize.py - id: presidio name: Presidio version: 2.2.364 role: PHI scrub / anonymization layer: 2 track: studio-engine kind: trust-observability subkind: privacy machine: host status: wired industry: eval-guardrails path: studio_platform/andi/requirements-andi312-foundation.txt - id: jev name: Jev version: 1.14.0 role: Domain reasoning arbiter (never replace) layer: 2 track: studio-engine kind: science-pack subkind: core machine: oracle status: wired industry: agent-orchestration path: studio_platform/andi/jev_client.py - id: casevault-jev name: CaseVault Jev assessment version: 1.14.0 role: Typed Jev questions for case defense — is_defensible (noul), case_priority (choice), risk_severity (score); JevClient imported from studio_platform; advisory only, never a score source; heuristic fallback when JEV_API_KEY is absent layer: 3 track: studio-products kind: andi-domain subkind: jev machine: host status: wired product_id: casevault industry: legal-tech path: products/saas/casevault/backend/andi/casevault_jev.py - id: z3 name: Z3 version: 5.1.0 role: Constraint / formal proof layer: 2 track: studio-engine kind: symbolic-formal subkind: smt machine: oracle status: wired industry: agent-orchestration uds_route: z3_verify path: studio_platform/andi/uds_daemon.py # z3-solver 5.3.1.0 has no aarch64 wheel (pip downloads z3_solver-5.3.1.0.tar.gz # source and builds from CMake); staying at 5.1.0.0 from conda-forge until an # ARM64 wheel is available. - id: clingo name: Clingo version: 5.8.2 role: Defeasible / ASP rule trees layer: 2 track: studio-engine kind: symbolic-formal subkind: asp machine: oracle status: wired industry: agent-orchestration uds_route: clingo_verify path: studio_platform/andi/uds_daemon.py - id: scallop name: Scallop version: vast role: Probabilistic Datalog (Jev verify) — Deferred (upgrade matrix 10–14); Vast Jev coprocessor when approved layer: 2 track: studio-engine kind: symbolic-formal subkind: datalog machine: vast status: wired industry: agent-orchestration uds_route: scallop_verify path: studio_platform/andi/scallop_bridge.py - id: pyoxigraph name: pyoxigraph version: 0.5.13 role: RDF ontologies (SNOMED/LOINC/…) layer: 2 track: studio-engine kind: data-memory subkind: rdf machine: oracle status: wired industry: data-graph-kb path: studio_platform/andi/requirements-andi312-foundation.txt - id: kuzu name: Kùzu version: 0.11.3 role: Property graph (payer/claims) layer: 2 track: studio-engine kind: data-memory subkind: graph machine: oracle status: wired industry: data-graph-kb uds_route: kuzu_query path: studio_platform/andi/foundation_routes.py - id: graphiti name: Graphiti version: 0.31.2 role: Temporal knowledge graph — episodes + entity edges with valid_at/invalid_at; cross-session memory for Atlas layer: 2 track: studio-engine kind: data-memory subkind: temporal-graph machine: oracle status: wired industry: data-graph-kb path: studio_platform/memory/temporal.py evidence: "Neo4j-backed; LLM extraction via LiteLLM tier/public-fast-dev; embeddings via Ollama bge-m3; called by studio-memory :8100 (save/recall)" - id: studio-memory name: Studio Memory service version: '1.0.0' role: Single plane-agnostic memory API — Qdrant semantic + Graphiti temporal; replaces Vast Redis word-overlap memory layer: 2 track: studio-engine kind: api-app subkind: memory-service machine: oracle status: wired industry: data-graph-kb path: studio_platform/memory/service.py evidence: "127.0.0.1:8100 systemd studio-memory; clients studio_platform/memory/client.py (Oracle) and utilities/astrabot/atlas/tools/memory_tool.py (Vast over SSH)" - id: duckdb name: DuckDB version: 2.0.0 role: Analytics + outcome logs — PropHunt analytics hardening (W1.6 / Phase 2 P4) when contracted layer: 2 track: studio-engine kind: data-memory subkind: analytics machine: oracle status: wired industry: data-graph-kb uds_route: duckdb_query path: studio_platform/andi/foundation_routes.py - id: statspai name: StatsPAI version: 1.40.1 role: Unified causal inference — live ATE/ATT/DiD estimates (statspai_causal + causal) layer: 2 track: studio-engine kind: science-pack subkind: causal machine: both status: wired industry: causal-clinical uds_route: statspai_causal uds_routes: - causal - statspai_causal path: studio_platform/andi/science_routes.py evidence: "run_statspai_causal/run_causal_estimate — real StatsPAI estimate (no presence-only gate), tested with demo ATE 1.53 (true 1.5)" - id: dowhy name: DoWhy version: 0.14.0 role: Causal viability (migrating → StatsPAI) layer: 2 track: studio-engine kind: science-pack subkind: causal machine: oracle status: wired industry: causal-clinical path: studio_platform/andi/requirements-andi312-foundation.txt - id: jax name: JAX version: 0.12.0.1 role: Accelerated compute (andi312 pin) — JIT numerical computation via UDS jax_compute layer: 2 track: studio-engine kind: science-pack subkind: numeric machine: both status: wired industry: inference-serving uds_route: jax_compute path: studio_platform/andi/science_routes.py - id: blackjax name: blackjax version: vast role: GPU MCMC / population uncertainty — Vast MCMC via blackjax_sample / blackjax_hmm layer: 2 track: studio-engine kind: science-pack subkind: mcmc machine: vast status: wired industry: reasoning-stats uds_route: blackjax_sample uds_routes: - blackjax_hmm - blackjax_sample path: studio_platform/andi/blackjax_bridge.py - id: numpyro name: NumPyro version: 0.22.0 role: Bayesian model inference via UDS numpyro_infer layer: 2 track: studio-engine kind: science-pack subkind: bayesian machine: both status: wired industry: reasoning-stats uds_route: numpyro_infer path: studio_platform/andi/science_routes.py - id: nutpie name: nutpie version: 0.16.11 role: Fast Rust NUTS via UDS nutpie_sample layer: 2 track: studio-engine kind: science-pack subkind: bayesian machine: both status: wired industry: reasoning-stats uds_route: nutpie_sample path: studio_platform/andi/science_routes.py - id: mapie name: MAPIE version: 1.6.0 role: Conformal prediction intervals via UDS mapie_conformal (+ venn_abers_calibrate) layer: 2 track: studio-engine kind: trust-observability subkind: calibration machine: both status: wired industry: reasoning-stats uds_route: mapie_conformal path: studio_platform/andi/science_routes.py - id: evidently name: Evidently version: 0.7.23 role: 'Data/model monitoring — Wave-1: activate one product monitor path' layer: 2 track: studio-engine kind: trust-observability subkind: monitoring machine: oracle status: wired industry: eval-guardrails uds_route: evidently_monitor path: studio_platform/andi/foundation_routes.py - id: run-evidently-cron name: Evidently weekly cron stub version: 0.1.0 role: 'Weekly evidently drift check cron entrypoint (Sundays 02:00 UTC); data wiring pending' layer: 2 track: studio-engine kind: trust-observability subkind: monitoring machine: oracle status: wired industry: eval-guardrails uds_route: evidently_monitor path: studio_platform/monitoring/run_evidently.py notes: 'scheduled: cron sunday 02:00 UTC; data wiring pending' - id: nannyml name: NannyML version: 0.13.1 role: 'Performance estimation / drift — Wave-1: activate one product monitor path' layer: 2 track: studio-engine kind: trust-observability subkind: drift machine: oracle status: wired industry: eval-guardrails uds_route: nannyml_estimate path: studio_platform/andi/foundation_routes.py - id: studio-telemetry name: Studio telemetry sink version: '1.0.0' role: Plane-agnostic Langfuse + MLflow emitter — agent turns (input/tools/output/latency/model) and UDS route calls (route/payload/response/latency) layer: 2 track: studio-engine kind: trust-observability subkind: tracing machine: oracle status: wired industry: eval-guardrails path: studio_platform/shared/telemetry/sink.py evidence: "background queue + stdlib HTTP; UDS hook in studio_platform/andi/uds_daemon.py handle_client; Atlas vendors utilities/astrabot/atlas/telemetry.py → POST :3025/telemetry/agent-turn" - id: deepeval name: DeepEval version: 4.0.4 role: Gate 11 eval suite — RAG relevance, tool-call validity, task completion; deterministic offline gate (max_drop 0.05) + drift-tolerant LLM-judge second tier layer: 2 track: studio-engine kind: trust-observability subkind: eval machine: oracle status: wired industry: eval-guardrails path: evals/deepeval/runner.py evidence: "scripts/run-deepeval-gate.sh --mode offline|judge; CI job studio-e2e-guards (Gate 11); baseline evals/deepeval/baseline.json" - id: mlflow name: MLflow version: 3.17.2 role: Experiment / artifact logging — UDS route + agent-task run tracking layer: 2 track: studio-engine kind: trust-observability subkind: mlops machine: oracle status: wired industry: eval-guardrails uds_route: mlflow_log path: studio_platform/andi/foundation_routes.py evidence: "agent runs logged to experiment agent-tasks by studio_platform/shared/telemetry/mlflow_http.py; every Atlas turn + AstraBot /task + /chat/stream" - id: studio-mlflow name: Studio MLflow tracking server version: 3.17.2 role: Tracking server :5000 — per-turn runs with turn count, tool calls, success/fail, latency per step layer: 2 track: studio-engine kind: trust-observability subkind: mlops machine: oracle status: wired industry: eval-guardrails path: infra/systemd/studio-mlflow.service evidence: "127.0.0.1:5000 sqlite /data/mlflow/mlflow.db; installed by scripts/install-observability-stack.sh" - id: shap name: SHAP version: 0.54.1 role: Feature attributions layer: 2 track: studio-engine kind: trust-observability subkind: explain machine: oracle status: wired industry: eval-guardrails uds_route: shap_explain path: studio_platform/andi/foundation_routes.py - id: pandera name: Pandera version: 0.34.1 role: DataFrame schema validation — PropHunt ingest contracts (W1.6 / Phase 2 P4) when contracted layer: 2 track: studio-engine kind: trust-observability subkind: validation machine: oracle status: wired industry: eval-guardrails uds_route: pandera_validate path: studio_platform/andi/foundation_routes.py - id: pymdp name: pymdp version: 1.0.4 role: Active inference multi-step policies (policy posterior + action validity) layer: 2 track: studio-engine kind: science-pack subkind: active-inference machine: oracle status: wired industry: reasoning-stats uds_route: pymdp_policy path: studio_platform/andi/foundation_routes.py - id: tigramite name: Tigramite version: 5.2.10.1 role: PCMCI causal discovery (time series) layer: 2 track: studio-engine kind: science-pack subkind: causal machine: oracle status: wired industry: causal-clinical uds_route: tigramite_pcmci path: studio_platform/andi/foundation_routes.py - id: pyagrum name: pyAgrum version: 3.3.0 role: Bayesian networks layer: 2 track: studio-engine kind: science-pack subkind: bn machine: oracle status: wired industry: reasoning-stats uds_route: pyagrum_infer path: studio_platform/andi/foundation_routes.py - id: pyg name: PyG version: 2.6+ role: GNN on clinical graphs — Deferred (upgrade matrix); Vast-only when clinical GNN contract layer: 2 track: studio-engine kind: science-pack subkind: gnn machine: vast status: wired industry: data-graph-kb uds_route: pyg_graphsage path: studio_platform/andi/pyg_bridge.py - id: pykeen name: PyKEEN version: vast role: KG embeddings (RotatE) — Vast KG embed — wire only with product contract layer: 2 track: studio-engine kind: science-pack subkind: kg-embed machine: vast status: wired industry: reasoning-stats uds_route: pykeen_embed path: studio_platform/andi/pykeen_bridge.py - id: pomegranate name: pomegranate version: vast role: GPU HMM trajectories — Vast DenseHMM — wire only with product contract layer: 2 track: studio-engine kind: science-pack subkind: hmm machine: vast status: wired industry: reasoning-stats uds_route: pomegranate_hmm path: studio_platform/andi/pomegranate_bridge.py - id: gcastle name: gCastle version: vast role: Causal structure learning layer: 2 track: studio-engine kind: science-pack subkind: causal machine: vast status: wired industry: causal-clinical uds_route: gcastle_discover path: studio_platform/andi/gcastle_bridge.py - id: fhir-resources name: fhir.resources version: 8.3.0 role: FHIR R4 validation boundary layer: 2 track: studio-engine kind: healthcare-io subkind: fhir machine: oracle status: wired industry: causal-clinical uds_route: fhir_validate path: studio_platform/andi/uds_daemon.py - id: pyx12 name: pyx12 version: 4.0.0 role: X12 EDI validation layer: 2 track: studio-engine kind: healthcare-io subkind: x12 machine: oracle status: wired industry: causal-clinical uds_route: x12_validate path: studio_platform/andi/uds_daemon.py - id: hl7apy name: hl7apy version: 1.3.5 role: HL7 v2 parsing layer: 2 track: studio-engine kind: healthcare-io subkind: hl7 machine: oracle status: wired industry: causal-clinical uds_route: hl7_parse path: studio_platform/andi/uds_daemon.py - id: bytewax name: Bytewax version: oracle role: Real-time FHIR stream layer: 2 track: studio-engine kind: healthcare-io subkind: stream machine: oracle status: wired industry: causal-clinical uds_route: bytewax_stream path: studio_platform/andi/fhir_stream.py - id: liboqs name: liboqs / oqs version: 0.16.0.1 role: Post-quantum crypto (quantum_shield) layer: 2 track: studio-engine kind: security-pqc subkind: pqc machine: oracle status: wired industry: eval-guardrails uds_route: quantum_shield path: studio_platform/andi/foundation_routes.py - id: ortools name: OR-Tools version: andi312 role: CP-SAT scheduling layer: 2 track: studio-engine kind: science-pack subkind: optimization machine: oracle status: wired industry: reasoning-stats uds_route: ortools_schedule path: studio_platform/andi/ortools_schedule.py - id: ragas name: RAGAS version: 0.2.15 role: RAG evaluation layer: 2 track: studio-engine kind: trust-observability subkind: eval machine: host status: wired industry: eval-guardrails path: studio_platform/andi/ANDI.md - id: lightrag name: LightRAG version: 1.5.6 role: Graph-augmented RAG — lightrag_query live; Studio KB (AGENTS.md, inventory, product contracts) indexed at startup layer: 2 track: studio-engine kind: llm-nlp subkind: rag machine: host status: wired industry: app-tooling uds_route: lightrag_query path: studio_platform/andi/lightrag_index.py evidence: "startup index /data/lightrag/studio; ollama bge-m3 + gateway Qwen3-4B entity extraction" - id: smolagents name: smolagents version: 1.26.0 role: agentic-orchestration layer: 2 track: studio-engine kind: llm-nlp subkind: agents machine: host status: wired port: 3025 product: astrabot industry: app-tooling path: utilities/astrabot/backend/agent.py note: >- 2026-10-21: mail tasks (email/mail/inbox/compose/send/reply/forward/gmail/ outlook) always delegate to Atlas — the email tools are ContextForge tools mounted only there. 2026-10-22: removed _local_lock — local runs are no longer serialized; the agent's rich console (QuietLiveConsole) never registers a Live display, so concurrent requests are supported (rich refuses a second Live on one console → parallel POST /task used to 500). - id: trafilatura name: trafilatura version: 2.3.1 role: web-content-extraction layer: 2 track: studio-engine kind: data-processing subkind: scraping machine: host status: wired product: astrabot industry: app-tooling path: utilities/astrabot/backend/agent.py - id: kokoro-onnx name: kokoro-onnx version: 0.4.7 role: text-to-speech layer: 2 track: studio-engine kind: audio subkind: tts machine: host status: wired product: astrabot industry: app-tooling path: utilities/astrabot/backend/main.py - id: atlas name: Atlas version: 2.6.0 role: task-bot — static tools + ContextForge-registered MCP servers on Vast layer: 2 track: studio-engine kind: llm-nlp subkind: agents machine: vast host: vast status: wired port: 8765 product: astrabot industry: app-tooling path: utilities/astrabot/atlas/main.py note: >- POST /task (blocking) + POST /task/stream (SSE: tool/delta/final). Advanced tools (code_exec, studio_bridge, studio_rag) are task-intent gated. Budgets: ATLAS_MAX_STEPS=4, ATLAS_MAX_TOKENS=1500, ATLAS_SEARCH_BUDGET=3. Session-aware MCP budgets: ATLAS_MCP_REQUEST_TIMEOUT_SEC=150, ATLAS_MCP_MAX_TOKENS=900 + a COMPOSIO router prompt section injected only when router tools mount. Deploy: scripts/deploy-atlas.sh (rsync → /venv/main MCP-stack guard → supervisorctl restart atlas → health + smokes). - id: atlas-mcp-session name: Atlas MCP session loader version: 2.6.0 role: >- Per-task MCP tool narrowcasting — mounts live Composio router sessions, prunes to the window-safe tool set, projects observations to compact summaries layer: 2 track: studio-engine kind: llm-nlp subkind: tools machine: vast status: wired port: 8765 product: astrabot industry: app-tooling path: utilities/astrabot/atlas/mcp_session.py note: >- Duplicate toolkit-set rows mount once; only COMPOSIO_MULTI_EXECUTE_TOOL + GET_TOOL_SCHEMAS + SEARCH_TOOLS survive; all schema/observation prose is deep-trimmed (ATLAS_MCP_DESC_CHARS=800, PARAM=240, OBS=3000, MAX_TOOLS=24) and observations PROJECTED: email results to subject/from/date strips, search to action inventories, schemas to {slug:{required,properties}}. Stringified router args (4B double-encode) parsed back to lists. Mail-explicit tasks with zero mounted session tools get a deterministic refusal (no credential-asking LLM fallback). Requires /venv/main mcp 1.x + mcpadapt>=0.1.13 (check_mcp_stack.py guard in deploy-atlas.sh). Smoke: tests/smoke_mcp_gmail.py (Block 4 step 5). 2026-10-21: a dead MCP session (mcpadapt closes its event loop when the collection's context exits) raised a bare "RuntimeError: Event loop is closed" — smolagents fed it back to the model, which kept calling dead tools until it ran out of steps. The closed-loop error is now MCPClientClosed (a BaseException, so the turn aborts instead of looping) and the caller RE-OPENS a fresh session; mail tasks no longer get web_search_fetch/browser (the model wandered into SearXNG and the wasted steps overflowed the 8192-token window, which is what killed the session in the first place). Contract: atlas/tests/test_mcp_closed_session.py. - id: atlas-search-tool name: Atlas WebSearchFetchTool version: 2.5.0 role: >- Web search + page extraction — direct fetch, Oracle SSH hop, in-process TTL cache, per-run search budget layer: 2 track: studio-engine kind: llm-nlp subkind: tools machine: vast status: wired product: astrabot industry: app-tooling path: utilities/astrabot/atlas/tools/web_search.py note: >- SearXNG is reached through ssh oracle (same hop as studio_bridge/studio_rag) because the Oracle instance is not publicly exposed. Caps: ATLAS_SEARCH_PAGE_CHARS=1200, ATLAS_SEARCH_OBSERVATION_CHARS=2600, ATLAS_SEARCH_BUDGET=3. - id: atlas-answer-stream name: Atlas answer streaming version: 2.5.0 role: Incremental decode of a streamed final_answer tool call so answers render progressively layer: 2 track: studio-engine kind: llm-nlp subkind: agents machine: vast status: wired product: astrabot industry: app-tooling path: utilities/astrabot/atlas/streaming.py note: >- AnswerExtractor decodes partial {"answer": "..."} JSON across fragments, keyed by tool call id (vLLM sends the name only on the first fragment and restarts index at 0 per message). Consumed by POST /task/stream and backend/atlas_client.py stream_atlas(). - id: browser-tool name: Atlas BrowserTool version: 2.5.0 role: Stealth headless Firefox (Camoufox) on Vast — fetch/screenshot/click/fill_and_submit layer: 2 track: studio-engine kind: llm-nlp subkind: tools machine: vast status: wired product: astrabot industry: app-tooling path: utilities/astrabot/atlas/tools/browser_tool.py note: >- 2026-10-21: Playwright/Chromium replaced by Camoufox (patched Firefox with spoofed navigator/WebGL/canvas fingerprints) — Chromium's automation fingerprint is what made the old fetch path look like a bot. The tool now answers with a "source" field: camoufox_proxy | camoufox_direct | searxng_fallback. Fallback chain: Camoufox through the configured proxy → Camoufox direct (a proxy may block some sites) → SearXNG snippets as a context source (fetch only). fill_and_submit still requires confirmed=true. The browser engine never runs on Oracle. 2026-10-22: the proxy leg is provider-agnostic (http/https/socks5) and is probed with a real handshake instead of a bare TCP connect, and the patched Firefox's GTK3/ALSA runtime libraries are now installed by the deploy script (a fresh Vast instance used to die with "libgtk-3.so.0: cannot open shared object file"). evidence: | utilities/astrabot/atlas/requirements.txt scripts/deploy-atlas.sh (camoufox + engine fetch + GTK3/ALSA guards) utilities/astrabot/atlas/tests/test_browser_tool.py - id: browser-proxy name: Atlas browser proxy version: 2.5.0 role: Optional outbound proxy for the Camoufox browser path — keeps the exit IP off the VM layer: 2 track: studio-engine kind: network subkind: proxy machine: vast status: wired product: astrabot industry: app-tooling path: utilities/astrabot/atlas/tools/browser_tool.py note: >- 2026-10-22: provider-agnostic proxy layer. ATLAS_PROXY_ENDPOINTS holds a comma separated "scheme://host:port" list (http / https / socks5); credentials come from ATLAS_PROXY_USER / _PASS or are embedded per endpoint (the engine can authenticate HTTP(S) proxies but NOT SOCKS5, so credentials are never handed to a SOCKS5 endpoint). The legacy WINDSCRIBE_PROXY_HOST / _PORT / _USER / _PASS pair is still read as a single endpoint. There is NO default endpoint — the old hard-coded default does not resolve anywhere and cost a DNS stall plus a probe on every fetch. Each endpoint is probed with a real handshake (CONNECT for HTTP, greeting + CONNECT for SOCKS5) and the verdict is cached (120 s ok / 300 s fail), so a dead endpoint costs one probe instead of one per request. A configured-but-unusable proxy is reported in the answer's "proxy_error" field. The settings are read at CALL time: main.py used to import the tool module before the dotenv was loaded, so the proxy on Vast was silently "not configured" whatever the env file said. Measured 2026-10-22: outbound 9443 is filtered from both Oracle and Vast, and Windscribe's location hosts accept TCP but drop the proxy handshake — a proxy only works on an endpoint this fleet can actually reach. The Oracle .env is the source of truth; scripts/deploy-atlas.sh merges the proxy keys into /workspace/atlas/.env on Vast (the browser used to have no proxy configuration there at all) and probes the endpoint from Vast. evidence: | utilities/astrabot/atlas/tools/browser_tool.py scripts/sync-proxy-env.py (Oracle .env → Atlas Vast env) scripts/deploy-atlas.sh (proxy config sync + probe smoke) utilities/astrabot/atlas/tests/test_browser_tool.py utilities/astrabot/atlas/tests/test_proxy_env_sync.py - id: warp-proxy name: Cloudflare WARP proxy (Oracle → Vast) version: 2.5.0 role: SOCKS5 egress hop — the Atlas browser exits through WARP, never through the Oracle VM IP layer: 2 track: studio-engine kind: network subkind: proxy machine: oracle status: wired product: astrabot industry: app-tooling path: scripts/ensure-warp-proxy.sh note: >- 2026-10-22: the working egress path, measured end to end. The WARP container (caomingjun/warp, --restart unless-stopped, --cap-add NET_ADMIN --device /dev/net/tun) publishes a SOCKS5 proxy on 127.0.0.1:11080 on Oracle — loopback only, never publicly exposed. Vast reaches it through the SSH hop the fleet already uses: a supervisor program (atlas-proxy-tunnel) holds `ssh -N -L 127.0.0.1:1080:127.0.0.1:11080 oracle`, so the browser's proxy is socks5://127.0.0.1:1080 on Vast. Verified 2026-10-22 from the Camoufox browser on Vast: source camoufox_proxy, exit IP 104.28.196.79 (Cloudflare) — not the Oracle VM IP (150.136.13.171) and not the Vast instance IP (117.183.204.240). The camoufox geoip profile (maxminddb extra) makes the stealth fingerprint match the exit address instead of the VM's. evidence: | scripts/ensure-warp-proxy.sh (container lifecycle + exit-IP verification) scripts/deploy-atlas.sh (Vast tunnel program + proxy smoke) utilities/astrabot/atlas/tools/browser_tool.py - id: mcp-client-layer name: Atlas MCP client layer version: 2.5.0 role: Per-session MCP tool load via SSH tunnel or direct remote URL layer: 2 track: studio-engine kind: llm-nlp subkind: agents machine: both status: wired product: astrabot industry: app-tooling path: utilities/astrabot/atlas/mcp_session.py note: Credentials never cross StudioBridge; localhost MCP tunneled - id: astrabot-connections name: AstraBot connections registry version: 2.9.1 role: Composio project-wide OAuth accounts + intent-gated tool-router sessions layer: 2 track: studio-engine kind: data-memory subkind: cache machine: oracle status: wired product: astrabot industry: app-tooling path: utilities/astrabot/backend/connections.py note: >- P3 (2026-10-21): Redis connection registry + credential vault removed; AstraBot keeps only Composio account linking and short-lived tool-router session rows (astrabot:composio_mcp:*). Identity binds to ASTRABOT_OWNER_UID (owner_identity.py); Composio listing is project-wide. - id: astrabot-composio name: Composio integration (connections + smart sessions) version: 0.27.0 role: OAuth linked accounts (Gmail/Outlook/GitHub/…) + intent-gated per-task MCP sessions layer: 2 track: studio-engine kind: llm-nlp subkind: auth machine: oracle status: wired product: astrabot industry: app-tooling path: utilities/astrabot/backend/connections.py note: >- COMPOSIO_API_KEY; single-owner identity via owner_identity.py. Sessions cannot bind rows of a foreign uid (verified) — groups are per owning uid, newest ACTIVE row's uid wins per toolkit. Intent gate matches mail PLURAL forms (emails/mails) — "list my recent emails" used to derive zero toolkits silently (2026-10-19 fix, test_intent_gate.py). evidence: | backend/tests/test_connections_owner_identity.py backend/tests/test_intent_gate.py - id: atlas-studio-bridge name: Atlas StudioBridgeTool version: 2.3.0 role: Vast→Oracle UDS bridge — generic route + 5 judgment tools (pymdp_policy, pyagrum_infer, dirichlet_tier, venn_abers_calibrate, ortools_schedule) layer: 2 track: studio-engine kind: llm-nlp subkind: tools machine: both status: wired product: astrabot industry: app-tooling path: utilities/astrabot/atlas/tools/studio_bridge.py evidence: "utilities/astrabot/atlas/tools/andi_judgment.py — route-specific descriptions + intent gate; test_judgment_tools.py" - id: atlas-studio-rag name: Atlas StudioRAGTool version: 2.2.0 role: Vast→Oracle Qdrant RAG via SSH + AstraBot /rag layer: 2 track: studio-engine kind: llm-nlp subkind: tools machine: both status: wired product: astrabot industry: app-tooling path: utilities/astrabot/atlas/tools/studio_rag.py - id: code-exec-tool name: Atlas CodeExecTool version: 2.3.0 role: firejail-sandboxed python3 on Vast (/tmp/atlas_sandbox, 10s, 2000 chars) — net namespace + private tmp + RLIMIT_AS 256 MB; bare subprocess + warning if firejail missing layer: 2 track: studio-engine kind: llm-nlp subkind: tools machine: vast status: wired product: astrabot industry: app-tooling path: utilities/astrabot/atlas/tools/code_exec.py note: >- firejail --net=none/--private-tmp are real; --read-only=/, --memory-limit and --rlimit-nproc are no-ops inside Vast's container, so the memory cap is also enforced via RLIMIT_AS (256 MB) in the wrapped shell. _NET_GUARD retained as defence-in-depth. Graceful bare-subprocess fallback + warning if firejail missing. - id: gmail-mcp name: Gmail MCP (gmail_query) version: 2.2.0 role: Oracle Gmail readonly via UDS gmail_query (OAuth refresh token) layer: 2 track: studio-engine kind: llm-nlp subkind: tools machine: oracle status: wired product: astrabot industry: app-tooling uds_route: gmail_query path: studio_platform/andi/gmail_routes.py - id: astrabot-history name: AstraBot Redis history version: 2.1.0 role: Session conversation memory (astrabot:history:{session_id}, TTL 7d) layer: 2 track: studio-engine kind: data-memory subkind: cache machine: oracle status: wired product: astrabot industry: app-tooling path: utilities/astrabot/backend/history_store.py - id: atlas-oracle-client name: AstraBot Atlas client (Oracle→Vast via Temporal) version: 2.8.0 role: >- Oracle call_atlas submits AtlasWorkflow to Temporal; stream_atlas/probe_atlas still use SSH curl for SSE/health layer: 2 track: studio-engine kind: network subkind: client machine: oracle status: wired product: astrabot industry: app-tooling path: utilities/astrabot/backend/atlas_client.py note: >- 2026-10-22 Temporal supersedes PR #248 SSH/curl task delegation + manual retry. call_atlas → Client.execute_workflow(AtlasWorkflow) on TEMPORAL_ADDRESS (Tailscale 100.85.164.66:7233), queue studio-tasks, execution_timeout 180s. Activity retries are Temporal RetryPolicy (3×, 2s×2 backoff). On Temporal/client failure LPUSH Redis atlas:dead_letter. stream_atlas remains SSH SSE (Temporal not suited for streaming); probe_atlas remains SSH /health. evidence: | utilities/astrabot/backend/atlas_client.py studio_platform/temporal/workflows/atlas_workflow.py utilities/astrabot/backend/tests/test_atlas_client_temporal.py - id: atlas-temporal-workflow name: Atlas Temporal workflow + Vast worker version: 2.8.0 role: >- Durable Atlas task execution — Oracle submits workflows; Vast worker polls via SOCKS5 and POSTs localhost :8765/task layer: 2 track: studio-engine kind: llm-nlp subkind: agents machine: both status: wired product: astrabot industry: app-tooling path: studio_platform/temporal/workflows/atlas_workflow.py note: >- Vast userspace Tailscale has no TUN; Temporal tonic/gRPC ignores ALL_PROXY/SOCKS5. Deploy opens supervisord temporal-tunnel (ssh -L 127.0.0.1:17233:100.85.164.66:7233 oracle) and temporal-worker (PYTHONPATH=/workspace python3 temporal_worker.py → 127.0.0.1:17233, queue studio-tasks). Activity execute_atlas_task → httpx POST http://127.0.0.1:8765/task. Oracle clients dial TEMPORAL_ADDRESS= 100.85.164.66:7233 on the Tailscale interface. evidence: | studio_platform/temporal/workflows/atlas_workflow.py utilities/astrabot/atlas/temporal_worker.py scripts/deploy-atlas.sh - id: jev-intent-classifier name: Jev System One intent classifier version: 1.14.0 role: >- Shared typed intent classification — one Jev System One choice question over chat/agent/store/andi/mail; regex scorer retained as the offline/keyless fallback (evidence_tier: heuristic) layer: 2 track: studio-engine kind: llm-nlp subkind: routing machine: oracle status: wired industry: app-tooling path: studio_platform/andi/jev_intent.py note: >- 2026-10-21: the intent classifier is platform-level, not product-scoped. It lives in studio_platform/andi/jev_intent.py next to the shared Jev client (studio_platform/andi/jev_client.py, whose JEV_MODEL stays the single pinned version and is never hardcoded in the classifier). The public interface is unchanged — classify(query) returns {intent, confidence, evidence_tier} with intent in chat|agent|store|andi|mail — and the regex scorer (_regex_classify) is kept as the fallback: a missing JEV_API_KEY or a raising Jev returns evidence_tier: heuristic. utilities/nous/backend/jev.py is a thin re-export so the existing call sites (graph.py::jev_node, bot_router.py) are untouched. PropHunt keeps its own product-specific questions in products/saas/prophunt/api/services/andi/prophunt_jev.py and resolves the SAME shared client. evidence: | studio_platform/andi/tests/test_jev_intent.py utilities/nous/backend/tests/test_jev_intent.py studio_platform/andi/jev_client.py - id: astrabot-upload name: AstraBot file upload version: 2.1.0 role: Multipart extract (PDF/TXT/DOCX/CSV/XLSX/image) → task context layer: 2 track: studio-engine kind: data-processing subkind: ingest machine: oracle status: wired product: astrabot industry: app-tooling path: utilities/astrabot/backend/upload_extract.py - id: searxng name: SearXNG version: latest role: web-search description: self-hosted meta-search layer: 2 track: studio-engine kind: data-processing subkind: scraping machine: oracle status: wired port: 4040 product: astrabot industry: app-tooling path: docker/searxng/docker-compose.yml note: >- Container studio-searxng binds docker/searxng/settings.yml. Default engine set is suspended from this host (IP-blocked: brave/google cse/wikipedia rate-limited, duckduckgo CAPTCHA) — working set is bing, mwmbl, seznam, yahoo, qwant, yep. - id: studio-ui name: '@studio/ui' version: from-package-json role: Design system package layer: 2 track: studio-design kind: design-system subkind: kit machine: n/a status: wired version_from: packages/studio-design-kit/package.json industry: design-kit - id: tailwind-v4 name: Tailwind CSS v4 version: '4' role: CSS-first @theme tokens layer: 2 track: studio-design kind: design-system subkind: styling machine: n/a status: wired industry: design-kit path: packages/studio-design-kit/package.json - id: react name: React version: from-root role: UI runtime layer: 2 track: studio-design kind: design-system subkind: runtime machine: n/a status: wired industry: design-kit path: packages/studio-design-kit/package.json - id: nextjs name: Next.js version: 15.x role: Product frontends layer: 2 track: studio-design kind: api-app subkind: frontend machine: host status: wired industry: design-kit path: dashboard/package.json - id: rhf-zod name: React Hook Form + Zod version: kit role: Forms via useStudioForm layer: 2 track: studio-design kind: design-system subkind: forms machine: n/a status: wired industry: design-ux path: packages/studio-design-kit/package.json - id: tanstack name: TanStack Query / Table / Virtual version: kit role: Data fetching & grids layer: 2 track: studio-design kind: design-system subkind: data-ui machine: n/a status: wired industry: design-ux path: packages/studio-design-kit/package.json - id: lucide name: Lucide version: kit role: Primary icon set layer: 2 track: studio-design kind: design-system subkind: icons machine: n/a status: wired industry: design-ux path: packages/studio-design-kit/package.json - id: product-studio name: Studio hub / API version: registry role: Dashboard + FastAPI layer: 3 track: studio-products kind: product subkind: hub machine: host status: wired product_id: studio industry: product-surface - id: product-astra name: Astra version: registry role: AI COS — Docker API :8001 + astra-frontend (prod tree WD) layer: 3 track: studio-products kind: product subkind: saas machine: host status: wired product_id: astra industry: product-surface - id: product-nous name: Nous version: registry role: Intelligence utility layer: 3 track: studio-products kind: product subkind: utility machine: host status: wired product_id: nous industry: product-surface - id: product-blueprint name: Blueprint version: registry role: Venture blueprint utility layer: 3 track: studio-products kind: product subkind: utility machine: host status: wired product_id: blueprint industry: product-surface uds_route: blueprint_generate - id: product-athena name: Athena version: registry role: Research / graph utility layer: 3 track: studio-products kind: product subkind: utility machine: host status: wired product_id: athena industry: product-surface uds_route: athena_research - id: product-astrabot name: AstraBot version: registry role: Atlas MCP agent utility — backend :3025 + frontend :3026 (basePath /astrabot) layer: 3 track: studio-products kind: product subkind: utility machine: host status: wired product_id: astrabot industry: product-surface - id: product-studio-shell name: Studio Shell version: registry role: Unified chrome for utilities layer: 3 track: studio-products kind: product subkind: shell machine: host status: wired product_id: studio-shell industry: product-surface - id: product-casevault name: CaseVault version: registry role: Case analysis SaaS — backend+frontend active; casevault-worker healthy. Jev typed questions — is_defensible (noul), case_priority (choice), risk_severity (score) layer: 3 track: studio-products kind: product subkind: saas machine: host status: wired product_id: casevault industry: product-surface - id: product-prophunt name: PropHunt version: registry role: Property search SaaS layer: 3 track: studio-products kind: product subkind: saas machine: host status: wired product_id: prophunt industry: product-surface - id: quantumshield name: QuantumShield version: planned role: PQC vault product (ML-KEM-768 / ML-DSA-65 / SLH backup + hybrid + KAT CI) — Wave-1 W1.1–W1.3, Phase 2 P0 layer: 3 track: studio-products kind: product subkind: saas machine: oracle status: planned industry: product-surface - id: ruptures name: ruptures version: andi312 role: Change-point / regimes via UDS ruptures_detect layer: 2 track: studio-engine kind: science-pack subkind: regimes machine: oracle status: wired industry: reasoning-stats uds_route: ruptures_detect path: studio_platform/andi/science_routes.py - id: onnxruntime name: onnxruntime version: andi312 role: Local ONNX inference via UDS onnx_infer layer: 2 track: studio-engine kind: science-pack subkind: onnx machine: oracle status: wired industry: inference-serving uds_route: onnx_infer path: studio_platform/andi/science_routes.py - id: opendp name: OpenDP version: n/a role: Differential privacy releases — defer until privacy product approval layer: 2 track: studio-engine kind: trust-observability subkind: privacy machine: oracle status: deferred industry: eval-guardrails - id: redpanda name: Redpanda version: n/a role: Multi-site event fabric — defer until multi-site contract layer: 1 track: studio-infra kind: compute-runtime subkind: messaging machine: oracle status: deferred industry: infra-ops - id: nats name: NATS version: n/a role: Edge / multi-worker agent bus — defer until edge contract layer: 1 track: studio-infra kind: compute-runtime subkind: messaging machine: oracle status: deferred industry: infra-ops - id: qpu name: QPU compute version: n/a role: Quantum hardware compute — not PQC; defer (separate paid hardware) layer: 2 track: studio-engine kind: compute-runtime subkind: qpu machine: n/a status: deferred industry: infra-compute - id: jupyter-per-product name: Per-product Jupyter version: n/a role: Kernel farm per product — defer; prefer OpenHands layer: 2 track: studio-engine kind: compute-runtime subkind: notebooks machine: oracle status: deferred industry: app-tooling - id: pyreason name: PyReason version: n/a role: Skip — Scallop covers when needed (upgrade matrix / target §3.4) layer: 2 track: studio-engine kind: symbolic-formal subkind: logic machine: n/a status: deferred industry: agent-orchestration - id: litellm-vendor-expansion name: LiteLLM extra vendors version: config role: New LLM vendors via LiteLLM only — Phase 3 optional (new task_type + budget) layer: 1 track: studio-infra kind: llm-nlp subkind: gateway machine: oracle status: planned industry: infra-llm - id: frontend-hibernate name: Frontend hibernate policy version: policy role: Idle product UI hibernate — Phase 4 efficiency (approved rows 15–16) layer: 1 track: studio-infra kind: compute-runtime subkind: policy machine: host status: planned industry: infra-ops - id: jev-expansion name: Jev expansion (beyond PropHunt) version: contract role: Phase 2 P3 — expand Jev only with written product contract layer: 2 track: studio-engine kind: science-pack subkind: core machine: oracle status: planned industry: causal-clinical - id: docker-astra-backend name: Astra Docker backend version: deploy role: astra-cos-deploy-backend-1 serving public :8001 /api /health layer: 1 track: studio-infra kind: api-app subkind: http machine: oracle status: wired industry: infra-ops path: products/saas/astra-ai-cos/docker-compose.yml - id: studio-wiki name: studio-wiki version: host role: Wiki server scripts/serve-wiki.py :8080 (studio-dev tree); data.json + README.md are generated artifacts (gitignored, rebuilt by generate-wiki.py or POST /regenerate). Restarted after prod sync (promote-batch, restart-prod-services, cd-prod-frontends, block3) so data.json regenerates from the synced main tip. layer: 1 track: studio-infra kind: api-app subkind: http machine: host status: wired industry: infra-ops path: scripts/serve-wiki.py - id: casevault-worker name: casevault-worker version: host role: Analysis worker for CaseVault document analysis — healthy layer: 3 track: studio-products kind: product subkind: worker machine: host status: wired product_id: casevault industry: product-surface note: opentelemetry missing; fixed 2026-10-22; worker healthy - id: dirichlet-tier name: Dirichlet tiering version: andi312 role: Bayesian tier update via UDS dirichlet_tier layer: 2 track: studio-engine kind: science-pack subkind: bayes machine: oracle status: wired industry: reasoning-stats uds_route: dirichlet_tier path: studio_platform/andi/dirichlet_tier.py - id: venn-abers name: Venn-Abers (MAPIE) version: andi312 role: Conformal calibration via UDS venn_abers_calibrate layer: 2 track: studio-engine kind: trust-observability subkind: calibration machine: oracle status: wired industry: eval-guardrails uds_route: venn_abers_calibrate path: studio_platform/andi/venn_abers_calibrate.py industries: - id: inference-serving label: Inference & model serving blurb: Model serving and accelerated compute - id: agent-orchestration label: Agent orchestration & workflow blurb: Graphs, durable workflows, symbolic verify - id: reasoning-stats label: Reasoning & statistical core blurb: Bayesian, probabilistic, embeddings - id: data-graph-kb label: Data, graph & knowledge blurb: Stores, graphs, ontologies, bridges - id: causal-clinical label: Causal & clinical intelligence blurb: Causal discovery, clinical NLP, healthcare I/O - id: eval-guardrails label: Evaluation, monitoring & guardrails blurb: Drift, eval, privacy, calibration, PQC - id: app-tooling label: Application & tooling surface blurb: APIs, MCP, workers, product UI kits - id: infra-compute label: Compute & edge blurb: Hosts, proxy, GPU, warm workers - id: infra-data label: Data plane blurb: Databases, cache, vectors - id: infra-llm label: LLM runtimes blurb: Gateways and local models - id: infra-ops label: Automation & observability blurb: Workflows, agents, tracing stacks - id: design-kit label: Design kit core blurb: Package, React, styling - id: design-ux label: Forms, data & icons blurb: Product UX building blocks - id: product-surface label: Product surfaces blurb: Hub, SaaS, utilities, shell