coulomb-social/docs/resource-evidence/demand-forecast-2026-08.md

96 lines
3.6 KiB
Markdown
Raw Normal View History

# Workload demand forecast — coulomb-social (2026-08)
| Field | Value |
|-------|--------|
| Resource | `resource:tenant:coulomb:coulomb-social` |
| Workplan | CSOC-WP-0005-T01 |
| Forecast version | `csoc-demand-2026-08-v1` |
| Created | 2026-08-12T09:03:47Z |
| Machine record | `demand-forecast-2026-08.json` |
## Scope
Demand for **this production instance** (Coulomb reference tenant on
Railiance). Deployment shape is **instance-per-client** (DR-1 C): future
external customers are **separate instances** and separate resource ids —
they are **not** folded into the high scenario.
| Case | What it models |
|------|----------------|
| **low** | Current parallel-host posture: few operators, Bubble still full product on apex |
| **base** | Coulomb community day-to-day on the rebuild (still one tenant) |
| **high** | Full Bubble-parity load on this Coulomb instance (HA-ish replicas/resources) |
## Proxies (stable units)
| Proxy | Unit | Notes |
|-------|------|--------|
| active_tenants | count | Expected 1 for this instance |
| active_members | MAU-ish Member count | App-owned |
| http_requests_per_month | count | App Service ingress |
| oidc_logins_per_month | count | Successful app logins |
| background_jobs_per_month | count | 0 until workers exist |
| app_database_gb | GB logical | `coulomb_social_db` on apps-pg |
| stored_media_gb | GB | App-owned binaries only |
| forgejo_content_gb_bound | GB | Attribution for space markdown on shared Forgejo |
| ingress_gb / egress_gb | GB/month | App path only |
| cpu/memory request·limit | mCPU / Mi | Declared K8s requirements |
| operator_hours_per_month | hours | Workload labor (T03) |
## Scenario table (monthly)
| Proxy | low | base | high |
|-------|----:|-----:|-----:|
| active_tenants | 1 | 1 | 1 |
| active_members | 5 | 50 | 500 |
| http_requests | 5000 | 150000 | 2000000 |
| oidc_logins | 80 | 1500 | 20000 |
| background_jobs | 0 | 0 | 5000 |
| app_database_gb | 0.1 | 1 | 10 |
| DB growth %/mo | 5 | 10 | 15 |
| stored_media_gb | 0 | 2 | 50 |
| forgejo_content_gb_bound | 0.01 | 0.5 | 20 |
| ingress_gb | 0.5 | 5 | 40 |
| egress_gb | 1 | 15 | 120 |
| cpu request (m) | 100 | 200 | 500 |
| mem request (Mi) | 256 | 512 | 1024 |
| replicas | 1 | 1 | 2 |
| operator h/mo | 2 | 4 | 8 |
| labor €/mo @ €60/h | 120 | 240 | 480 |
Infrastructure EUR is **not invented** here. Cost joins should treat
infrastructure as an allocated share of cluster, apps-pg, ingress, and
identity platform once those owners and fin-hub supply figures.
## Capacity floor (current deploy declaration)
From `railiance-apps` chart defaults (production values do not override
resources as of 2026-08):
| Dimension | Value |
|-----------|--------|
| replicas | 1 |
| cpu request / limit | 100m / 1000m |
| memory request / limit | 256Mi / 1Gi |
| media PV | disabled |
| Image tag (values) | `7fcd0cf` (railiance-apps helm values; may lag git HEAD) |
## How resource-control should use this
1. Pick scenario band from observed MAU / requests (or default **low** until
Bubble migration starts).
2. Feed proxies into monthly forecast/actual control (null infrastructure
until platform prices exist).
3. Attribute Forgejo-bound content via `forgejo_content_gb_bound` without
double-counting storage in the app resource.
4. Recalibrate after three comparable months (MAPE on members, requests, DB
GB, labor hours).
## Assumptions and falsifiability
See JSON `assumptions` array. Primary falsifiers after each calendar month:
- measured `active_members` outside the active scenario band by >2×
- `app_database_gb` growth vs declared growth %
- operator hours vs T03 labor log