{"id":"pst_01M3E11Z8G57GH8QPPVRZZ4NW8","url":"https://openvibe.blog/@openvibe/patch-notes-staged-tables-move-to-chat-one-table-at-a-time","blog":{"id":"blg_01M362MF0EDJ7QHQTRD8A3Q981","handle":"openvibe","title":"The OpenVibe blog","url":"https://openvibe.blog/"},"title":"Patch notes: Staged tables move to Chat one table at a time","summary":"What shipped on OpenVibe from 2026-09-25 to 2026-09-26: 82 changes to OpenVibe.Network, OpenVibe.Live, OpenVibe.Games, OpenVibe.Media, OpenVibe.Tools, OpenVibe.Billing and 12 more.","body_markdown":"What shipped on OpenVibe from 2026-09-25 to 2026-09-26: 82 changes to OpenVibe.Network, OpenVibe.Live, OpenVibe.Games, OpenVibe.Media, OpenVibe.Tools, OpenVibe.Billing and 12 more. Every line below is a commit message from the OpenVibers repositories, linked to the change itself.\n\n## Highlights\n\n- **OpenVibe.Chat:** Staged tables move to Chat one table at a time (WS-I task 2, register C-04; Live d6480da): table_authority now says who writes channel_moderators, channel_moderation_settings, emotes, user_tags, chat_ai_summaries and chat_timeline_events… ([`e17dbbb`](https://github.com/OpenVibers/OpenVibe.Chat/commit/e17dbbbf73205942cf5d0abec2651c2b948c1b97))\n- **OpenVibe.Live:** Staged chat tables move to OpenVibe.Chat one table at a time (WS-I task 2, register C-04): server/chat/chat-tables.js reads who writes channel_moderators, channel_moderation_settings, emotes, user_tags, chat_ai_summaries and… ([`d6480da`](https://github.com/OpenVibers/OpenVibe.Live/commit/d6480da64c589a55db58450ae74119b6d2606600))\n\n## OpenVibe.Network\n\n[openvibe.network](https://openvibe.network) · [repository](https://github.com/OpenVibers/OpenVibe.Network)\n\n- nginx (openvibe.network): /oauth/token gets its own limit (60/min, burst 30) instead of the sign-in limit (5/min) — a developer app's client-credentials tokens got 503s mid-flow (found by the daily developer path); limits answer 429; the… ([`e5da5ac`](https://github.com/OpenVibers/OpenVibe.Network/commit/e5da5ac127e9ca454e8c80ba28c56ddb11226f1d))\n- Status: the daily developer path's last run (passed or failed, each step) on /status and in /api/v1/status, from its result file — WS-N task 1 ([`dc4cfb1`](https://github.com/OpenVibers/OpenVibe.Network/commit/dc4cfb153480bac4446062ede0f264fbf26c56d7))\n- Tools job proof (WS-L task 4): principal probe gets tools.job.create/read and events.event.read; /status and /api/v1/status show its last run (tools_job_proof) next to the developer path ([`5716fd6`](https://github.com/OpenVibers/OpenVibe.Network/commit/5716fd62e7c25a050d472eb1cd3c6787e4a16976))\n- Moderation audit log (WS-D task 1): records tools, games, wiki, blog, news, reviews, deals, coupons, trade and codes .moderation.action (common.moderation-action@1, Contracts 0.53.0), one row each with the service from the event's prefix… ([`89f3eee`](https://github.com/OpenVibers/OpenVibe.Network/commit/89f3eee462708b6ebb38fa30c948cddeae7284ca))\n- Moderation audit: media.moderation.action too (Media's staff holds), in the consumer, the subscription topics and the admin filter; contracts 0.54.0 ([`ce7596b`](https://github.com/OpenVibers/OpenVibe.Network/commit/ce7596b1cdcc563d03910948e558d637f3346436))\n- Site settings as revisioned configuration (WS-C task 7): network.site_settings on openvibe-shared/config 1.14.0 journals every admin change (PUT /api/admin/settings, /email, /discord) as a revision with who and why, rows keep their type (a… ([`cc405d5`](https://github.com/OpenVibers/OpenVibe.Network/commit/cc405d5841e9df27bbd9aa2ce65cf2360d1f01cb))\n- Size budgets for the home page (WS-T task 1): openvibe-shared/perf-budget 1.15.0 measures / as the server answers it (a fresh database, no browser) in npm test; budgets a little above the 2026-09-26 measurement (html 88 KB, js 6 files 228… ([`71cf957`](https://github.com/OpenVibers/OpenVibe.Network/commit/71cf9577f4ff24483e9121675caeca0ed066d96e))\n- Graceful stop (WS-P lifecycle): on SIGTERM Network stops taking connections, closes idle keep-alive ones and lets requests in flight finish (10 s at most) before exiting 0; it was the one service without a handler, so every restart cut… ([`d1b7323`](https://github.com/OpenVibers/OpenVibe.Network/commit/d1b7323aeff1adeb1c4b7037c01e007a795ec33b))\n- Graceful stop, all of it (WS-P lifecycle follow-up): SIGTERM now also stops what used to run into the exit: the maintenance timers (notifications, email queue, retired-module sweep, session cleanup), the analytics prune, the ecosystem… ([`631ed6f`](https://github.com/OpenVibers/OpenVibe.Network/commit/631ed6f202c59e8a7efd0dc70d3087798237f448))\n- Loyalty (WS-K task 9): Live reads and writes its private live.loyalty summary (contracts 0.56.0; a grant row seeded under the older default gains it at boot); test/loyalty-policy.test.js: nobody holds the OpenCoins transfer grant (revoked… ([`3900cd3`](https://github.com/OpenVibers/OpenVibe.Network/commit/3900cd32ab42aec76b64cace1c7a58b79705c15b))\n- Community themes with a review queue, import and export (WS-E task 2): a submitted or imported theme is pending and private to its author (usable by them at once, at most five waiting) until an admin approves it at /api/admin/themes (Theme… ([`4f28b66`](https://github.com/OpenVibers/OpenVibe.Network/commit/4f28b66aa7186769ccca768d30809d8eddf8fbab))\n- Pages the browser check flagged (Host scripts/browser-check.js, WS-Q task 3): /login gets a canonical URL, a no-JS note (the form panels need JavaScript), named password toggles (\"Show password\"/\"Hide password\", was axe button-name… ([`6665245`](https://github.com/OpenVibers/OpenVibe.Network/commit/66652450d41dd3a0a0feac5d04d28036d8a43b9c))\n- npm test runs test/page-checks.test.js (the browser-check fixes: /login, the /updates filter chip, the home JSON-LD name) ([`dae6ab2`](https://github.com/OpenVibers/OpenVibe.Network/commit/dae6ab232b8b4cb43bf091e2f7aed95a20f55bcd))\n- Operator parity checklist (WS-D task 5): an admin tab and GET /api/admin/operator-checklist list every operator job the old admin did (people, site, health/storage/media, queues, moderation/money/loyalty, releases/readiness) and where it… ([`15e4d88`](https://github.com/OpenVibers/OpenVibe.Network/commit/15e4d887ae86d6a92db2c5c34e7165b80c4fefbc))\n\n## OpenVibe.Live\n\n[openvibe.live](https://openvibe.live) · [repository](https://github.com/OpenVibers/OpenVibe.Live)\n\n- Rollback with newer writes (WS-P task 13): a database this release migrated and wrote to boots and works under the release of a week ago (checked out into a temporary worktree: initDb over the newer schema without errors, reads, writes)… ([`8f2b4c3`](https://github.com/OpenVibers/OpenVibe.Live/commit/8f2b4c30d72767fb5d4ae23453bb3f8fcace12b2))\n- Expand/migrate/contract check (WS-P task 12): a new DROP TABLE, DROP COLUMN or rename of a real table in server/ fails the suite until test/fixtures/destructive-migrations.json lists it with its dated contract step; the five known table… ([`26c69e0`](https://github.com/OpenVibers/OpenVibe.Live/commit/26c69e0614769156e673ebbadf2b72b0890d461b))\n- Clip cuts follow their Media job (WS-G task 3): a clip the server cuts answers with its clip.cut job id; the channel page and the broadcast dashboard follow it (public/js/ov-clip-jobs.js) and open the trim editor or say it failed, with a… ([`73c8a39`](https://github.com/OpenVibers/OpenVibe.Live/commit/73c8a39b78ebdab8b98cf6840d3238b71c37eeec))\n- Site settings as revisioned configuration (WS-C task 7): live.site_settings on openvibe-shared/config 1.14.0 journals every admin change to site_settings as a revision with who and why (bulk and single PUT, DELETE), rows written around it… ([`c7cb628`](https://github.com/OpenVibers/OpenVibe.Live/commit/c7cb6285a0534506384efcd27f0871568ce9747e))\n- Search facets and autocomplete (WS-O task 10): /search shows the first page's category and channel facets with counts and narrows to one (?category=&channel=, a new query starts without them); the box suggests titles as you type (GET… ([`fe1fdf9`](https://github.com/OpenVibers/OpenVibe.Live/commit/fe1fdf911f5510362bce98edef89a5d82dc0a956))\n- Search suggestions: one per type and title (many VODs share a title), the best-ranked ([`fbc7846`](https://github.com/OpenVibers/OpenVibe.Live/commit/fbc784645e01b919d28ce8f7a759878bbdf8a5a2))\n- Staged chat tables move to OpenVibe.Chat one table at a time (WS-I task 2, register C-04): server/chat/chat-tables.js reads who writes channel_moderators, channel_moderation_settings, emotes, user_tags, chat_ai_summaries and… ([`d6480da`](https://github.com/OpenVibers/OpenVibe.Live/commit/d6480da64c589a55db58450ae74119b6d2606600))\n- Loyalty summary (WS-K task 9): Live writes its private live.loyalty user module on Network: channel points across channels and the top ten by points, the Arena Trash Level and XP (loyalty, never money; contracts 0.56.0). Viewers with… ([`bf06877`](https://github.com/OpenVibers/OpenVibe.Live/commit/bf068778f5af2816981a5ca16b1c538ec88ed4f4))\n- What the browser check found on Live (Host scripts/browser-check.js, WS-Q task 3): /chat and /search are server-rendered with their own title and canonical (/search?q=… names /search and stays noindex; its meta existed but the route was… ([`934156b`](https://github.com/OpenVibers/OpenVibe.Live/commit/934156bb0fc87bd1a90134effe8d490305e1309a))\n- Found by the browser check on /vod/… and /clip/… (Host scripts/browser-check.js, WS-Q task 3): the VOD, clip and channel players' volume sliders are named (\"Volume\"; axe label, critical), and a guest's page no longer asks… ([`fcfc0d5`](https://github.com/OpenVibers/OpenVibe.Live/commit/fcfc0d5c9bf034ad515183604b4a8a365336a590))\n\n## OpenVibe.Games\n\n[openvibe.games](https://openvibe.games) · [repository](https://github.com/OpenVibers/OpenVibe.Games)\n\n- Moderation audit (ADR-022, WS-D task 1): games.moderation.action from the outbox in the same transaction when staff revoke (mod.revoked, with the reason and the grants it ended), disable (mod.disabled) or put back a disabled (mod.enabled)… ([`28c621d`](https://github.com/OpenVibers/OpenVibe.Games/commit/28c621dcea65ebf3e03a9f822ac7637961e93c52))\n- Readiness reports the players online (WS-P task 2): a non-required sessions check with detail.online, which OpenVibe.Host's protected probe reads before a restart disconnects them ([`e11dd65`](https://github.com/OpenVibers/OpenVibe.Games/commit/e11dd65c90724b224a04951aec9172967cd1afc1))\n- Home keeps its navigation when openvibe.network is down (WS-P task 5): a plain nav (home, Scraplandia, the network sites) shows until the shared navbar mounts, and the theme loader is deferred so a slow openvibe.network never holds the… ([`ef3b2cf`](https://github.com/OpenVibers/OpenVibe.Games/commit/ef3b2cf9564bddd01a522578976247895dc8119a))\n- Graceful stop (WS-P lifecycle follow-up): SIGTERM used to exit synchronously, cutting every WebSocket session and HTTP request in flight and never awaiting the outbox. Now, within 10 s (the unit allows 30): stop taking connections and… ([`142d4ec`](https://github.com/OpenVibers/OpenVibe.Games/commit/142d4ec0a750b524200b0a789a103b85a2753bd2))\n- dist-types: the shutdown test's declarations (tsc --build output, as for every other test) ([`45fe3fa`](https://github.com/OpenVibers/OpenVibe.Games/commit/45fe3fa81936bc0eaa311993581b8a4fd8aa4921))\n- Legacy import: the 12 held users re-checked 2026-09-26 (still unreachable: no linked account, disabled password markers, SSO-only Live); the 200 rows stay a documented import-hold (WS-M task 8) ([`1b70b69`](https://github.com/OpenVibers/OpenVibe.Games/commit/1b70b69e0e72819522870e94b7469e42bc06d93c))\n- Client pages name an icon: public/favicon.svg, the network's app icon in the Games colours (openvibe-shared/app-icon favicon({ site: 'games' })), linked from index, play and editor. Without it the browser asked for /favicon.ico, which… ([`0f29769`](https://github.com/OpenVibers/OpenVibe.Games/commit/0f297696c79053e197db9876a187d042ea526542))\n\n## OpenVibe.Media\n\n[openvibe.media](https://openvibe.media) · [repository](https://github.com/OpenVibers/OpenVibe.Media)\n\n- H15 repair (WS-G task 7): scripts/h15-repair.js tries every copy of each object with no good copy before anything is condemned: a B2/R2 copy marked corrupt only because its size differs from the size recorded at creation (no content hash)… ([`cbe1413`](https://github.com/OpenVibers/OpenVibe.Media/commit/cbe1413040c5f3fb4091a5e8e99af0f2afcd80b7))\n- Waveform and preview-sprite variants as jobs (WS-G task 13): object.waveform (PNG, showwavespic) and object.sprite (JPEG sheet from one fast seek per frame, layout in its metadata) make private asset objects recorded as the source's… ([`f9c89e1`](https://github.com/OpenVibers/OpenVibe.Media/commit/f9c89e179cb52572be207938fca8d5f2d82c9552))\n- Clip cut on media_jobs (WS-G task 3): a new clip's cut and every re-cut run as the job clip.cut (lane clips, 2 at a time, runs while recording): POST /clips and /:id/recut answer 202 with job_id for the UI to follow and reattach to… ([`1337cc1`](https://github.com/OpenVibers/OpenVibe.Media/commit/1337cc169a772b5cd22c841fb66cbfd9b4f1af04))\n- Storage-tier policy as revisioned configuration (WS-C task 7): media.storage_tier on openvibe-shared/config 1.14.0: revision 1 imported from media_settings, PUT /tiers/settings is one validated revision (types, 1-100 percentages, interval… ([`41b548e`](https://github.com/OpenVibers/OpenVibe.Media/commit/41b548ec1773fa5e58bd348d5ec2a63d1df3bd87))\n- Moderation audit (WS-D task 1): placing or releasing a staff hold (moderation, dmca, admin, evidence) announces media.moderation.action (common.moderation-action@1) in the same transaction, the staff subject as actor when named; a… ([`c90ea88`](https://github.com/OpenVibers/OpenVibe.Media/commit/c90ea8868fc3b796b4c5b2dcbee9f0bc56b4978d))\n- Size budgets for the home page (WS-T task 1): openvibe-shared/perf-budget (shared 1.15.0) measures / as the server answers it on a fresh database, no browser, in npm test; budgets a little above the 2026-09-26 measurement ([`37accc9`](https://github.com/OpenVibers/OpenVibe.Media/commit/37accc988c7510e933286f97d22baa977ee201c7))\n- Job fencing (WS-P lifecycle follow-up): succeed() and fail() matched status = 'running' only, with no owner token, so a worker that had lost its job (lease run out, recovery requeued it, another claim took it) could still overwrite it… ([`a348ea7`](https://github.com/OpenVibers/OpenVibe.Media/commit/a348ea716e33d8ca07b154a7b0a928963eb58c2b))\n\n## OpenVibe.Tools\n\n[openvibe.tools](https://openvibe.tools) · [repository](https://github.com/OpenVibers/OpenVibe.Tools)\n\n- Network diagnostics family acceptance (WS-L task 6): every net tool, taken from the registry, has a tools.tool@1 entry on its own host (input and route, or a stated reason when unavailable), help content (title, description, intro… ([`195e8ce`](https://github.com/OpenVibers/OpenVibe.Tools/commit/195e8ce1c81c0222e8165a9fc7dbd72bced165b8))\n- Favourites for everyone (WS-L task 1): without an account a browser keeps its starred tools in the ov_tool_favs cookie on the tools zone (24, newest first) and they join the account's favourites once at sign-in; stars on search results as… ([`db18e70`](https://github.com/OpenVibers/OpenVibe.Tools/commit/db18e70da73aedb60fe52aa3a0521d230e66f672))\n- Size budgets for the home page (WS-T task 1): openvibe-shared/perf-budget (gateway on shared 1.15.0) measures the gateway's / as it runs, no browser, in npm test; budgets a little above the 2026-09-26 measurement (html 135 KB / 19 KB… ([`78b8f8f`](https://github.com/OpenVibers/OpenVibe.Tools/commit/78b8f8fc39f44bc09e2e707898b5196dfe651125))\n- Graceful stop for every Tools process (WS-P lifecycle follow-up): apps/_shared/graceful.js on SIGTERM/SIGINT stops timers, pollers and the job worker first, then stops taking connections, closes idle keep-alive ones, answers requests in… ([`93f0f6c`](https://github.com/OpenVibers/OpenVibe.Tools/commit/93f0f6c844f3b2f96bd363698b6907a73d937ab8))\n- /developers: long commands scroll inside their code blocks instead of widening the page (858 px wide at 768 px, found by the browser check, Host scripts/browser-check.js, WS-Q task 3), and each block is focusable with a visible focus ring… ([`2140ef5`](https://github.com/OpenVibers/OpenVibe.Tools/commit/2140ef50e58ec3646056dd29cefd172977d45917))\n- Family pages' \"Open …\" button (.cta) is --on-accent-strong on --accent-strong (openvibe-shared 1.13.0 tokens, 4.5:1 in every theme) instead of white on --accent (3.67:1, axe color-contrast serious on /network-tools, /developer-tools… ([`f0307c0`](https://github.com/OpenVibers/OpenVibe.Tools/commit/f0307c04c84f1519110a2a854638f3a4269fef60))\n- Tool pages: the \"Primary\" address tag on the highlighted row is --text-primary instead of --text-muted, which read 3.16:1 on the accent glow (axe color-contrast serious on /tool/yaml and every tool page; found by the browser check, WS-Q… ([`858845c`](https://github.com/OpenVibers/OpenVibe.Tools/commit/858845cfc8df62f11cf103c86619c58b2040a04a))\n\n## OpenVibe.Billing\n\n[billing.openvibe.network](https://billing.openvibe.network) · [repository](https://github.com/OpenVibers/OpenVibe.Billing)\n\n- Public billing policy at /policy (WS-K task 10): what a viewer pays per Vibe at each tier, what a creator receives and what OpenVibe keeps, tips credited in full, subscription price, split and site-route fee, cashout minimum, hold and… ([`72cf2d2`](https://github.com/OpenVibers/OpenVibe.Billing/commit/72cf2d28582df3db6b03a8ffe3bc3eff59dc901c))\n- Console test: robots.txt allows the public /policy and nothing else ([`8ca3039`](https://github.com/OpenVibers/OpenVibe.Billing/commit/8ca3039455b4038ffe62740b6ed9d7f3812c6250))\n- Policy: the terms link goes to openvibe.network/terms (the /legal/terms path does not exist) ([`2bc0cd0`](https://github.com/OpenVibers/OpenVibe.Billing/commit/2bc0cd07ce3dba80de67889c68f962d9faf926a6))\n- .env.example: names with a working default are commented (optional), so ovhost validate's from-example check requires only what the service cannot run without ([`4a5cddf`](https://github.com/OpenVibers/OpenVibe.Billing/commit/4a5cddfb983a04be10204534c75fb73b6f091bb6))\n- /policy: a canonical link (config.baseUrl + /policy) and the network's app icon inline (openvibe-shared/app-icon), so the browser no longer asks the API for /favicon.ico and logs its 404 on every visit; both found by the browser check… ([`f7ff3cd`](https://github.com/OpenVibers/OpenVibe.Billing/commit/f7ff3cd2b8d4dbe6cedcdaaad52c02343971a146))\n- nginx vhost: the public policy (/policy, /policy.json, /robots.txt) is served without the host-wide X-Robots-Tag noindex, as robots.txt and the app intend (the browser check found production's /policy noindex); that location repeats… ([`5fa5546`](https://github.com/OpenVibers/OpenVibe.Billing/commit/5fa55460de7c280952d651d2166f6e62d8ffd9fe))\n\n## OpenVibe.Codes\n\n[openvibe.codes](https://openvibe.codes) · [repository](https://github.com/OpenVibers/OpenVibe.Codes)\n\n- API explorer (WS-C task 6): /docs/api lists every service's OpenAPI 3.1 document from openvibe-contracts 0.51.0; /docs/api/:service shows each route with its method, capabilities, visibility, parameters, request and response schemas… ([`eba81c5`](https://github.com/OpenVibers/OpenVibe.Codes/commit/eba81c5a10bf44d38568beaf09411f519c502339))\n- Docs: the update system (WS-A task 4) at /docs/updates: the network changelog feed and its shape (with a live sample), the data-ov-shipped markup, openvibe-shared/frame shipped()/updatesBody()/shippedScript() and openvibe-sdk/frame… ([`fbe0ebe`](https://github.com/OpenVibers/OpenVibe.Codes/commit/fbe0ebed426d81a401a1567076bedc4d7f7c91df))\n- Moderation audit (ADR-022, WS-D task 1): codes.moderation.action from the outbox in the same transaction: release.revoked when Codes staff revoke a release their project role would not let them manage (also a staff project deletion)… ([`28dbf08`](https://github.com/OpenVibers/OpenVibe.Codes/commit/28dbf08b9be0b67c990b60e73df02beccfb8764d))\n- Docs: /docs/billing renders the billing policy from OpenVibe.Billing's /policy.json (WS-K task 10): currencies, purchase tiers with the creator value and what OpenVibe keeps, tips, the subscription split and fee, cashout minimum and hold… ([`e86ba95`](https://github.com/OpenVibers/OpenVibe.Codes/commit/e86ba956eabd844d630630b28cabfb189e46d7b6))\n- .env.example: names with a working default are commented (optional), so ovhost validate's from-example check requires only what the service cannot run without ([`237d9ff`](https://github.com/OpenVibers/OpenVibe.Codes/commit/237d9ff2216b2cbdcf85a746102ce595686796fb))\n- nginx: /auth/me, the session probe the shared navbar asks on every page view, gets its own location on the API zone (burst 30) instead of the sign-in zone (10 a minute, burst 10), and both answer 429 when limited instead of nginx's default… ([`f1ddee9`](https://github.com/OpenVibers/OpenVibe.Codes/commit/f1ddee9adf0084ba9af74a08805672c22049e358))\n\n## OpenVibe.Blog\n\n[openvibe.blog](https://openvibe.blog) · [repository](https://github.com/OpenVibers/OpenVibe.Blog)\n\n- Moderation audit (ADR-022, WS-D task 1): blog.moderation.action from the outbox in the same transaction when staff unpublish (post.unpublished) or delete (post.deleted) a post only their staff powers allow, with the author as… ([`ee4a607`](https://github.com/OpenVibers/OpenVibe.Blog/commit/ee4a6075f90ecc31577036d9c35dba950036902d))\n- Size budgets for the home page (WS-T task 1): openvibe-shared/perf-budget (shared 1.15.0) measures / as the server answers it on a fresh database, no browser, in npm test; budgets a little above the 2026-09-26 measurement ([`30a2b69`](https://github.com/OpenVibers/OpenVibe.Blog/commit/30a2b698d2c80a166152df2e8a82001c89350dbe))\n- .env.example: names with a working default are commented (optional), so ovhost validate's from-example check requires only what the service cannot run without ([`d48688d`](https://github.com/OpenVibers/OpenVibe.Blog/commit/d48688d5e269b5a66886fe2dd5abfd961acc40a9))\n- Buttons and .button links are --on-accent-strong on --accent-strong (openvibe-shared 1.13.0 tokens, 4.5:1 in every theme) instead of white on --accent (3.67:1, axe color-contrast serious on the 404 page's \"The OpenVibe blog\" link; found by… ([`b5b49d3`](https://github.com/OpenVibers/OpenVibe.Blog/commit/b5b49d36539025db4505361dddba14ddc3d1b49c))\n- nginx: /auth/me, the session probe the shared navbar asks on every page view, gets its own location on the API zone (burst 30) instead of the sign-in zone (10 a minute, burst 10), and both answer 429 when limited instead of nginx's default… ([`6555217`](https://github.com/OpenVibers/OpenVibe.Blog/commit/65552174ad0507744bb993adae3c006aeb4f4de1))\n\n## OpenVibe.Chat\n\n[openvibe.chat](https://openvibe.chat) · [repository](https://github.com/OpenVibers/OpenVibe.Chat)\n\n- Staged tables move to Chat one table at a time (WS-I task 2, register C-04; Live d6480da): table_authority now says who writes channel_moderators, channel_moderation_settings, emotes, user_tags, chat_ai_summaries and chat_timeline_events… ([`e17dbbb`](https://github.com/OpenVibers/OpenVibe.Chat/commit/e17dbbbf73205942cf5d0abec2651c2b948c1b97))\n- Online now (WS-F task 2, ADR-005 amendment 1): GET /api/chat/online?users=a,b answers online or offline for up to 50 usernames from Chat's open connections (global chat, rooms, DMs); nothing stored, no Events topic; someone hidden by… ([`0b68fb6`](https://github.com/OpenVibers/OpenVibe.Chat/commit/0b68fb654e42532a6551eabff47129b93a9a045f))\n- Chat rooms on the realtime plane (WS-I task 9, contracts 0.57.0): a message in a public room is announced as chat.room.message.created (visibility public) in the transaction that stores it; deleting one, or turning the room private… ([`593513b`](https://github.com/OpenVibers/OpenVibe.Chat/commit/593513b8fbb4bc92be23f6eb61055c6a81e4ae94))\n- nginx: /auth/me, the session probe the shared navbar asks on every page view, gets its own location on the API zone (burst 30) instead of the sign-in zone (10 a minute, burst 10), and both answer 429 when limited instead of nginx's default… ([`d461fd4`](https://github.com/OpenVibers/OpenVibe.Chat/commit/d461fd4f5dc794a618dfd3d05fc9d7e465229ae7))\n- nginx: every Chat location that sets its own proxy_set_header (Connection \"\" for upstream keepalive) repeats Host and the client address: /auth/me, /auth/, /api/ and / had lost the server-level ones, so REST requests reached Chat as… ([`b2d329a`](https://github.com/OpenVibers/OpenVibe.Chat/commit/b2d329a38076d8e0d60a1b11e86c86b9bc1b6ebf))\n\n## OpenVibe.Community\n\n[openvibe.community](https://openvibe.community) · [repository](https://github.com/OpenVibers/OpenVibe.Community)\n\n- Size budgets for the home page (WS-T task 1): openvibe-shared/perf-budget (shared 1.15.0) measures / as the server answers it on a fresh database, no browser, in npm test; budgets a little above the 2026-09-26 measurement ([`5bf0400`](https://github.com/OpenVibers/OpenVibe.Community/commit/5bf0400f03abf1906dc96193659789c1053f596a))\n- Graceful stop (WS-P lifecycle follow-up): SIGTERM used to close only the HTTP server (which waited on 65 s keep-alive connections until the 5 s fallback) while the events outbox, the Discord relay, the Pulse subscription retries and the… ([`fc7aaf6`](https://github.com/OpenVibers/OpenVibe.Community/commit/fc7aaf6ae2ba04744ba8ac4c2ae0bdfc45ffb8e1))\n- Breadcrumb links are underlined: in the muted crumb line they were told apart by colour alone (axe link-in-text-block, serious, on /pulse, /s and every paste and thread page; found by the browser check, Host scripts/browser-check.js, WS-Q… ([`4072708`](https://github.com/OpenVibers/OpenVibe.Community/commit/407270881a59dc89f6bc0e9dc17a7f8a8c48033f))\n- nginx: /auth/me, the session probe the shared navbar asks on every page view, gets its own location on the API zone (burst 30) instead of the sign-in zone (10 a minute, burst 10), and both answer 429 when limited instead of nginx's default… ([`eb68e9e`](https://github.com/OpenVibers/OpenVibe.Community/commit/eb68e9e19ad1de41eb6870a9d43e050d4b81086e))\n\n## OpenVibe.AI\n\n[ai.openvibe.network](https://ai.openvibe.network) · [repository](https://github.com/OpenVibers/OpenVibe.AI)\n\n- Graceful stop stops the ai.run.* relay (WS-P lifecycle follow-up): close() (SIGTERM) now, after runs.drain() has queued the last run events, stops the events outbox and awaits its send in progress (events.stop(); unsent rows stay for the… ([`dc75e16`](https://github.com/OpenVibers/OpenVibe.AI/commit/dc75e16896b83c50021cc50a1368b641ad266c20))\n- Citations or explicit gaps on every run (WS-O task 3): each run records grounding { cited, gaps }: the source ordinals its output cites, and the gaps it names; an output that cites nothing and names no gap gets one written for it (no… ([`5451f85`](https://github.com/OpenVibers/OpenVibe.AI/commit/5451f859a40f9fa69c3d1c62e3bbffff3ba1b2be))\n\n## OpenVibe.Deals\n\n[openvibe.deals](https://openvibe.deals) · [repository](https://github.com/OpenVibers/OpenVibe.Deals)\n\n- Moderation audit (ADR-022, WS-D task 1): deals.moderation.action from the outbox in the same transaction when a moderator edits, expires, disables, enables, reviews, merges or unmerges someone else's offer (offer.*, the submitter as… ([`98999bf`](https://github.com/OpenVibers/OpenVibe.Deals/commit/98999bf3adf986798fded95d2e29c12bd4a6d75c))\n- .env.example: names with a working default are commented (optional), so ovhost validate's from-example check requires only what the service cannot run without ([`68537be`](https://github.com/OpenVibers/OpenVibe.Deals/commit/68537beb17c3105d1ec919540ccdd6a606c9831a))\n\n## OpenVibe.Wiki\n\n[openvibe.wiki](https://openvibe.wiki) · [repository](https://github.com/OpenVibers/OpenVibe.Wiki)\n\n- Size budgets for the home page (WS-T task 1): openvibe-shared/perf-budget (shared 1.15.0) measures / as the server answers it on a fresh database, no browser, in npm test; budgets a little above the 2026-09-26 measurement ([`b793836`](https://github.com/OpenVibers/OpenVibe.Wiki/commit/b7938368446bb03ab04da18efdb714ff61dcf682))\n- nginx: /auth/me, the session probe the shared navbar asks on every page view, gets its own location on the API zone (burst 30) instead of the sign-in zone (10 a minute, burst 10), and both answer 429 when limited instead of nginx's default… ([`a8362b9`](https://github.com/OpenVibers/OpenVibe.Wiki/commit/a8362b9bb9d568265bac54a8e94ef8c2316bff0e))\n\n## OpenVibe.Coupons\n\n[openvibe.coupons](https://openvibe.coupons) · [repository](https://github.com/OpenVibers/OpenVibe.Coupons)\n\n- Moderation audit (ADR-022, WS-D task 1): coupons.moderation.action from the outbox in the same transaction when staff or a staff-capable service disables, expires, re-enables (coupon.disabled|expired|enabled, the note as reason) or… ([`f86f660`](https://github.com/OpenVibers/OpenVibe.Coupons/commit/f86f660d397bfcfb6d5afc77174ef90bdcff669b))\n\n## OpenVibe.News\n\n[openvibe.news](https://openvibe.news) · [repository](https://github.com/OpenVibers/OpenVibe.News)\n\n- .env.example: names with a working default are commented (optional), so ovhost validate's from-example check requires only what the service cannot run without ([`8103b67`](https://github.com/OpenVibers/OpenVibe.News/commit/8103b67eaec0330b136fc9e6b149c739c4d32e79))\n\n## OpenVibe.Search\n\n[search.openvibe.network](https://search.openvibe.network) · [repository](https://github.com/OpenVibers/OpenVibe.Search)\n\n- The front page and /updates carry a canonical URL on the configured origin (config.baseUrl, passed to pageRouter); result pages stay noindex without one. The browser check (Host scripts/browser-check.js, WS-Q task 3) found the indexable… ([`99f1e76`](https://github.com/OpenVibers/OpenVibe.Search/commit/99f1e7627a95883dbb05b36927b948e9bf3cd7dd))\n\n## OpenVibe.Tips\n\n[openvibe.tips](https://openvibe.tips) · [repository](https://github.com/OpenVibers/OpenVibe.Tips)\n\n- .env.example: names with a working default are commented (optional), so ovhost validate's from-example check requires only what the service cannot run without ([`1cfee92`](https://github.com/OpenVibers/OpenVibe.Tips/commit/1cfee92a93fa9781d7c5f9ceaa5dbadc9a4dc3af))\n\n## OpenVibe.VIP\n\n[openvibe.vip](https://openvibe.vip) · [repository](https://github.com/OpenVibers/OpenVibe.VIP)\n\n- .env.example: names with a working default are commented (optional), so ovhost validate's from-example check requires only what the service cannot run without ([`ad49965`](https://github.com/OpenVibers/OpenVibe.VIP/commit/ad49965fa4703d4175525f662e45341fea3b6408))\n\n---\n\nPatch notes are put together automatically when enough changes have shipped, or when a large feature lands. See every site's own updates page for the live list.","revision":1,"state":"published","visibility":"public","published_at":"2026-09-26T04:54:56.022Z","revised_at":"2026-09-26T04:54:56.018Z","author":{"subject":"usr_01KKT9AC60KM7CRTB3WN1Z8P56","name":"goosely","username":"goosely"},"authorship":{"mode":"imported","workflow":null,"reviewed":false,"disclosure":{"mode":"imported","short":"Imported","long":"Imported from Commit messages from the OpenVibers repositories on GitHub; originally by OpenVibers."}},"tags":["patch-notes","network","live","games","media","tools","billing","codes","blog","chat","community"],"categories":[],"series":{"title":"Patch notes","url":"https://openvibe.blog/@openvibe/series/patch-notes","position":null},"media":[],"citations":[],"indexability":{"indexable":true,"robots":"index, follow","reasons":[]}}