openvibers/openvibe.fun CHANGELOG.md
CHANGELOG.md
| 1 | # Changelog |
| 2 | |
| 3 | What changed in OpenVibe.Fun, newest first. |
| 4 | |
| 5 | ## 0.1.0 — 2026-10-28 |
| 6 | |
| 7 | The first version: IRL quests on Live, the local guide and group plans. |
| 8 | |
| 9 | - **IRL quests on Live.** `fun_quest_boards` is a streamer's board for one session, checked against the public |
| 10 | OpenVibe.Live channel and the signed-in Network username. `fun_quests` is suggested → accepted → live → completed |
| 11 | → verified, with `rejected` and `hidden`. Suggestions pass an explainable dangerous/illegal/trespassing/ |
| 12 | harassment filter before they are stored; a board can be accessible-only and has a suggestion cap. One vote per |
| 13 | person per quest. |
| 14 | - **Verification and reward.** A completed quest is verified by `FUN_QUEST_VERIFY_VOTES` distinct public chat checks |
| 15 | or by a Network moderator (`global_mod`+). A local `fun_badges` row is always paid; `fun_quest_rewards` records the |
| 16 | OpenCoins ledger. OpenCoins are loyalty points, never money, and are credited only with `FUN_COINS=on` through |
| 17 | Network's `identity.subject.resolve` + `network.coins.credit` with the reward id as the idempotency key. |
| 18 | - **Chat is read, never posted.** A timer reads one public page of the channel's `GET /api/chat/global/history` and |
| 19 | applies `!quest vote`, `!quest suggest`, `!quest verify` and `!plan vote` at most once per message id. Deleted or |
| 20 | unsafe messages are skipped. Under `FUN_DRILL` the timer is off; tests call `runOnce()`. |
| 21 | - **The local guide.** `fun_geo_cache` stores OSM/Ticketmaster JSON. Nominatim and Overpass requests carry |
| 22 | `FUN_OSM_USER_AGENT`, are paced per host (1/s by default), cached seven days with stale fallback and are bounded to |
| 23 | one around: radius. Places show distance, address, opening hours, accessibility, a tile-free map and ODbL |
| 24 | attribution. Ticketmaster Discovery is off unless `TICKETMASTER_API_KEY` is set; the key is never cached, returned |
| 25 | or logged. No model call, no AI capability, no paid provider. |
| 26 | - **Group plans.** `fun_plans` + `fun_plan_options` + `fun_plan_votes`: one vote per person or public chat username, |
| 27 | changing allowed until close, a tie refused, owner/staff decides, and the winner goes to the caller's own |
| 28 | OpenVibe.Today through Today's public event API with the caller's token and `Idempotency-Key: fun-plan-<id>`. |
| 29 | - **Safety and moderation.** `fun_reports` collects signed-in safety/spam/other reports; staff list them and can hide |
| 30 | a public quest or plan. Hiding writes a Search tombstone. |
| 31 | - **Search.** Each public quest/plan is one `search.index-document@1` in `fun_outbox` (owner `fun`, types `quest` |
| 32 | and `plan`), with a revision, public URL and public body. The relay waits for the `search.document.write` grant. |
| 33 | - **The service.** Network SSO as OAuth client `fun` (PKCE S256, `fun_at`/`fun_rt`/`fun_oauth`), truthful readiness, |
| 34 | Prometheus metrics on loopback, discovery, deploy files, and server-rendered pages with stable `fu-` ids plus a |
| 35 | no-JS OBS overlay. `public/css/fun.css` and `public/js/fun.js` are one-comment placeholders for the main session. |
| 36 | - **Account data.** Export covers boards, suggestions, votes, checks, badges, rewards, plans, options, plan votes and |
| 37 | reports. Deletion erases personal rows and anonymizes the community record (subject NULL); another person's rows |
| 38 | and public titles stay. |
| 39 | - **Tests.** Migration, guide/cache/pacer/Ticketmaster, quest safety and state machine, chat idempotency, plans and |
| 40 | Today, Search document validation, SSO, pages/cache, coins opt-in and account export/deletion, each in its own |
| 41 | process on a temporary PGlite database with a mock Network and upstream fixtures. |
| 42 |