Everything that ships lands here. Newest first. Built from the repo
CHANGELOG.md so marketing and the app stay in sync.
Unreleased
No bullets in this section yet.
2026-08-04
Added
- Capture module split (`static/js/capture/camera.js`, `photo.js`) with **in-app camera only**, snap → confirm → upload.
- Capture busy state **uploading** (before photo) separate from grading.
- Run detail returns short-lived **before_url / after_url** for resume thumbs.
- Product score = **quality% × chore max points** (API: `score`, `max_points`, `quality_pct`).
Changed
- Beta welcome manifesto: dorm competition line now mentions **$10 team fee** and real cash incentive next season. *(Superseded 2026-08-18 — the real figure has always been $20; see that section.)*
- **Sentry** fully configured from `SENTRY_DSN` (errors, traces, logging integration); optional `/api/sentry-debug` behind `ENABLE_SENTRY_DEBUG`.
- Finalise awards **proportional** points (not always full chore value on pass).
- Gemini multimodal timeout raised; offline fallback says Coach Jordan; client shows degraded banner.
- Photo library / stock upload path **removed** from capture UI (in-app only).
Fixed
- Anti-cheat no longer flags the same run’s before vs after (exclude `run_id` from house scan).
- **Camera blocked live:** reverse proxy had `Permissions-Policy: camera=()`; app host now allows `camera=(self)`. Capture boot/camera failures surface in-page (not silent).
2026-08-18
Added
- Public **`/pricing`** page — free during the public beta, then $5/person/month plus an optional $20/house/season competition entry, split 50/50 with the prize pool.
- **"What ChorHaus Actually Is"** section on the marketing home page — plain explanation of the product plus the roadmap (cross-house/cross-school leagues, prize pool), clearly framed as the plan rather than a live feature.
- Site-wide rotating tagline strip on every marketing page (server-side random pick each request; the marketing site carries no client JS by design).
- Two new approved taglines: **"Even our trash talk is clean."** and **"You clean. I clean. Everybody cleans."**
- **Stripe subscription billing**: checkout, webhook, and per-house subscription status (`House.stripe_customer_id`, `stripe_subscription_id`, `subscription_status`), priced per person via Checkout `quantity` = live house member count.
- Billing is **admin-gated** (`House.billing_beta_access`, default off; `POST /admin/houses/{id}/billing-access` to grant) — every billing route 404s for a house without it, whether or not Stripe is even configured.
- Billing status + **Upgrade** control in the house settings panel (hidden entirely unless the house has beta access).
Changed
- Monthly subscription price **decided: $5/person/month, flat** (was an undecided $5–10 range).
- Competition entry fee confirmed at $20/house/season, still 50/50 split with the prize pool.
Fixed
- Stripe checkout/webhook success and cancel URLs pointed at `chorhaus.com`, a domain nobody owns — now the real app host.
- Webhook handler crashed on `client_reference_id` (a plain string from Stripe) before it could persist anything, since `House.id` needs a real `uuid.UUID` — every webhook would have 500'd against a live account.
- Corrected a stale **"$10 fee"** in the beta-welcome text; the real competition entry has always been $20/house/season.
2026-08-02
Added
- Public **changelog** page (`/changelog`) linked from marketing nav/footer and the app arena; rendered from root `CHANGELOG.md` (agents append every change).
- Marketing **trash-talk wall** with all approved catchphrases from brand voice.
- Free public **beta manifesto** on marketing home and app welcome banner.
- Contact email **nemo@justadestination.com** on public surfaces.
- **v1 colour skins** (Slate, Nordic Forest, Cyber, Barbie Pink, Baby Blue) as app themes.
- Welcome banner, SMS/join invite links (`/?join=`), add EXTRA chore to the wheel.
- Live **camera capture** dialog (getUserMedia) with library fallback.
- Coach Jordan naming (UI + prompts); still SpaceXAI-backed when key present.
- Inter-house **trash talk** + rivals API/UI; SQL `009_trash_talk.sql`.
- EPL-style **league table** centered on your house with level colour skins.
- House settings behind ⚙️; pets/kids removed from UI.
- Custom chore add form under the weekly rota.
Changed
- Contact email → **nemo@justadestination.com** on marketing surfaces.
- Rules page: human review / bank / retry wording (no longer “not appealable”).
- Campus create flow: searchable campus datalist to reduce league splintering.
Fixed
- Capture resume: `GET /api/chores/runs/{id}` + real points from ledger.
- Steal flow ownership and `?steal=1` UI path.
- Review escalate enum `PENDING_REVIEW`; admin resolve queue.
- Week roll cron + Scheduler (Sunday 00:05 UTC).
2026-08-01
Added
- Foundation ops checklist; Cloud Scheduler week-roll job.
- Admin human review resolve (uphold / override).
- Settings + injured reserve (bench) API and UI.
Fixed
- `ChoreStatus.PENDING_REVIEW` in Python enum.
- Logo path for marketing banner.
- Rota/steal CSS on live dashboard.
- Service worker stale cache issues (static-only precache).
2026-07
Added
- ChorHaus v2 rebuild: FastAPI + Jinja, own Google OAuth, schema `chorhaus_v2`.
- Chore wheel, Gemini grading, dHash anti-cheat, scoring ledger, marketing/app hosts.
- Mechanics as single source of truth (`content/mechanics.toml`).
- 2026-08-04: [RESOLVED G1] Python 3.10 tomllib compatibility fallback in backend/content.py and backend/services/wheel.py
- 2026-08-04: [RESOLVED G2] SQLite local dev database fallback and HTTP 200 health check readiness probe
- 2026-08-04: [RESOLVED G3] Standardized naive utcnow() to timezone-aware UTC datetime across ORM models and services
- 2026-08-04: [RESOLVED G4] Epoch-based week_index calculation for continuous parity monotonicity across year boundaries
- 2026-08-04: [RESOLVED G5] Standardized stealing_open and week boundaries to explicit UTC today in backend/services/rota.py
- 2026-08-04: [RESOLVED G6] Weekly chronicle generation with ChoreAttempt join, GET /api/house/chronicle route, and week roll cron hook
- 2026-08-04: [RESOLVED G7] Implemented POST /api/social/dataset/contribute endpoint with automatic 50pt DATASET_BOUNTY point awards
- 2026-08-04: [RESOLVED G8] Dynamic Gemini AI valuation (20-150 pts) for custom user-added chores
- 2026-08-04: [RESOLVED G9] Added Stripe billing router with checkout-session and webhook verification
- 2026-08-04: [RESOLVED G10] Created seed locations.toml catalog and exposed GET /api/locations/search endpoint
- 2026-08-04: [RESOLVED G11] Added theme column to User model, PATCH /api/house/me/theme route, and server-rendered data-theme
- 2026-08-04: [RESOLVED G12] Created shared conftest.py fixtures and test_chores_flow.py HTTP integration tests
- 2026-08-04: [RESOLVED G13] Rule A15 lifespan startup hook for Fleet Command registration and brdkst service.up event
- 2026-08-04: [RESOLVED G14] Created scripts/check_migrations.py database verifier and tests/test_migration_schema.py
- 2026-08-04: [RESOLVED G15] Created scripts/verify.sh automated smoke runner and updated DEPLOY.md