TERRANOETIS

Platform services

Platform v3.0.0 Docs v3.0.0 MEASURED — health/metrics endpoints observed on boot

Full description: Read the full narrative

Security controls
ControlVerified detailSource
Passwordsscrypt N=16384, r=8, p=1 (RFC 7914 family); no plaintextserver/utils/passwords.ts:8-10
JWTHS tokens, TTL 1 h prod / 1 d dev; startup refuses JWT_SECRET < 32 chars in prod; refresh only for unexpired tokens of existing usersserver/middleware/auth.ts:8,257-281 server/index.ts:171-181
Lockout10 failed attempts → 15 min lockout, HTTP 423server/middleware/auth.ts:9-10,65-73,151
Bootstrap adminrequires ADMIN_BOOTSTRAP_PASSWORD ≥ 16 chars in prodserver/middleware/auth.ts:104-110
Rate limitslogin 5/15 min; public data 300/min/IP; agent 30/min; local-ask 20/min; in-process map storeserver/index.ts:306,307,9167-9168 server/middleware/rateLimiter.ts:8-80
Tenant isolationclosed table set (chats, monitor_rules, scheduled_tasks, profiles, feedback); no user input in SQL stringsserver/middleware/tenantIsolation.ts:5-20
Validationzod: message ≤ 10k; ≤ 4 images ≤ 8 MB; ≤ 12 history × 4 KB; sandbox code ≤ 20k, timeout 1–120 sserver/middleware/validate.ts:3-43
Errorscanonical {error:{code,message}}, stacks hidden in prod; 413 on body overflowserver/middleware/errorHandler.ts:23-40
SSRF guardvalidateOutboundUrl + allowlist at outbound fetch sitesserver/utils/ssrfGuard.ts:module SECURITY.md
AuditauditLog → audit_logs on sandbox exec, simulate, deletesserver/middleware/audit.ts:3-19

Code execution & jobs

SubsystemVerified detailSource
SandboxPython/Node/Bash via sandboxManager + e2b cloud option; concurrency caps 3 local / 10 cloudserver/index.ts:8655-8658
Lite simulation enginessimplified in-process surrogates in server/sandboxV2 — farsiteLite (cellular ROS), adcircLite (storm-surge SWE), wrfLite, hysplitLite (particle dispersion), fnoSurrogate (Fourier neural operator) — named after, not reimplementations of, the operational models; earlier docs implied the originals (corrected)server/sandboxV2:module files
Job queueSQLite job_queue; 10 concurrent; maxAttempts 3; recurring: materialized-view refresh 60 s, plugin scan 30 s, synthetic data 1 h, KG stats 10 minserver/queue/simple-queue.ts:22-60,1013+ server/index.ts:1006-1039
Pluginsinstall from URL/GitHub/raw/zip; toggle/remove; loads isolated with failure loggingserver/pluginManager.ts:module server/index.ts:941-942
E2E/eval harnessAI-chat golden + e2e scripts; evals + prompt lab under server/ml and scripts/package.json:16-29

Observability

SignalImplementationSource
Logspino JSON + correlationId; heap log 60 sserver/observability/logger.ts:6,33,53-64
Metricsprom-client: http totals/duration, SSE gauge, sandbox/cache/db/tool/omninet counters at /api/metricsserver/observability/metrics.ts:13-86
Tracing/errorsin-house OpenTelemetry-style tracing init + Sentry opt-in via SENTRY_DSNserver/index.ts:14450-14457
Health/api/health (+ /ready, /live) with component checks — measured payload on Getting startedserver/index.ts:375-381
OpenAPIspec at /api/openapi.json + docs UI /api/docs (generated from routes/openapi.ts)server/routes/openapi.ts:module server/index.ts:494