Water Intelligence Engine

Section 1 — People Adults = Expert + Typical + Glamper (auto)

{{ peopleErrors[userTypeKey(u)] }}

Adults Total = {{ adultsTotal }} (auto-sum)

Section 2 — Tank & Environment

{{ tankErrors.fresh_capacity }}
{{ tankErrors.grey_capacity }}
{{ tankErrors.black_capacity }}
{{ tankErrors.fresh }}
{{ tankErrors.grey }}
{{ tankErrors.black }}
{{ tankErrors.climate_multiplier }}
{{ tankErrors.target_autonomy }}
{{ tankErrors.alert_threshold }}
Behavioral Drift
Models day-to-day unpredictability via N(1.0, σ=drift/2) clipped to [1−drift, 1+drift].
{{ driftPct }}
0 — none 1 — max
Draw from N(1.0, {{ driftSd }}) clipped to [{{ driftLo }}, {{ driftHi }}]
Drift = 0 — all days use exact baseline (deterministic)
locked random
{{ tankErrors.drift_seed }}
♻️ Greywater Recycling
Accumulated grey water from the previous day (shower, sinks) is redirected to toilet flushing, reducing fresh water consumption.
Open Plan → Tank capacity & daily change to see fresh and grey runway.

Section 3 — Behavior Multipliers

User TypeCountShower MultSink MultToilet Mult
{{ b.user_type }}{{ userCount(b.user_type) }} {{ behaviorErrors[behaviorFieldKey(b.user_type, 'shower_mult')] }} {{ behaviorErrors[behaviorFieldKey(b.user_type, 'sink_mult')] }} {{ behaviorErrors[behaviorFieldKey(b.user_type, 'toilet_mult')] }}

Section 4 — Activity Engine

ActivityFlow (gal/min)Duration (min)Events/DayGal/UnitGreyBlack
{{ a.name }} {{ activityErrors[activityFieldKey(a.id, 'flow_gal_per_min')] }} {{ activityErrors[activityFieldKey(a.id, 'duration_min')] }} {{ activityErrors[activityFieldKey(a.id, 'events_per_day_per_person')] }} {{ activityErrors[activityFieldKey(a.id, 'gal_per_unit')] }}
{{ saveMsg }}

Tank Runway

Outlook
{{ planOutlookHeadline }}
{{ supportStatusFootIcon }}{{ supportStatusFootLabel }}
{{ tank }} Main constraint
{{ tankDays(tank)?.toFixed(2) }}days
{{ waterCardPlanIcon(tank) }} {{ waterCardPlanFoot(tank) }}
Timeline check At this usage, your {{ results.stability_score.target_days }}-day itinerary fits the tanks — the tightest stream has about {{ results.stability_score.limiting_days?.toFixed(2) }} days of runway.
Timeline check {{ results.stability_score.limiting_days?.toFixed(2) }} d of runway vs. a {{ results.stability_score.target_days }}-day target ({{ targetDaysGap.toFixed(2) }} d short) — {{ results.stability_score.limiting_tank }} tank is the constraint.
{{ actionIcon(action.category) }}
{{ formatRecommendedActionText(action.title) }} {{ formatRecommendedActionText(action.summary) }}
+{{ action.estimated_days_gain?.toFixed(2) }} d

Tank Projections Numbers behind the outlook — deterministic baseline. ♻ recycling on

TankCapacityCurrentDaily ΔRunway (days)Note
{{ t.tank }} {{ t.capacity_gal?.toFixed(1) }} {{ t.current_gal?.toFixed(1) }} {{ t.daily_delta_gal > 0 ? '+' : '' }}{{ t.daily_delta_gal?.toFixed(2) }} {{ t.days_remaining >= 9999 ? '∞' : t.days_remaining?.toFixed(2) }} {{ t.status }}

Expected Daily Use Baseline gallons per day before drift — your demand profile.

ActivityFresh/dayGrey/dayBlack/dayAttrib %
{{ r.activity_name }} {{ r.daily_fresh_gal?.toFixed(2) }} {{ r.grey_added_gal?.toFixed(2) }} {{ r.black_added_gal?.toFixed(2) }} {{ r.fresh_attrib_pct?.toFixed(1) }}%
TOTAL {{ totalFresh?.toFixed(2) }} {{ totalGrey?.toFixed(2) }} {{ totalBlack?.toFixed(2) }} 100%

Demand by Day See how each activity stacks across your stay (gal/day per stream). drift {{ results.drift?.toFixed(2) }}

Activity Day {{ d }}
{{ saveMsg }}

Realtime — Day View ♻ recycling on

⚠️ {{ item.message }}