# Phase 1 resource policy — config-driven, not hard-coded (decision #4). # No specific production numbers chosen yet; target host class for planning is ~16 cores/32 # threads, 128GB RAM, SSD/NVMe. Actual per-lab limits get set by benchmarking (see # docs/PHASE1_PLATFORM_FOUNDATION.md §8 test 9), not guessed backward from the spec sheet. # These defaults are sized for local single-machine Phase 1 dev/testing only. default: cpu_limit: 2.0 # vCPUs mem_limit_mb: 4096 pids_limit: 512 storage_limit_mb: 8192 # only enforced if the host's Docker storage driver supports # --storage-opt size= (see known-limitations in the SOP) idle_threshold_minutes: 30 # past this: log a warning event only abandoned_threshold_minutes: 120 # past this: reaper destroys for real reaper_poll_interval_seconds: 60 health_check: path: /api/health timeout_ms: 240000 # k3s cold start in a nested container can be slow — matches the # ~60-attempt wait already in scripts/entrypoint.sh # Phase 4.1 §26 — admission control. Disabled (no cap) by default, on purpose: don't fabricate # a concurrency number before it's measured against the real host (docs/CAPACITY_PLANNING.md). # Set max_concurrent_labs from infra/scripts/capacity-model.js's real hard-admission-control # output once the production host exists, so a full host rejects new Labs cleanly (503, "Lab # capacity is temporarily full") instead of failing mid-provision once Docker itself runs out # of room. # admission_control: # max_concurrent_labs: null