openvibers/openvibe.network Commits

Wave 0 baseline: regenerate after the Wave 5 paste cutover (Community owns pastes; Media paste writes frozen)

OP OpenVibers committed 22 Sept 2026 · 1bc6a52174 · 12 files, +1180 −370


Changes

ddiff --git a/docs/roadmap-baseline/01-services.md b/docs/roadmap-baseline/01-services.md
iindex 6f43c723..59ade949 100644
---- a/docs/roadmap-baseline/01-services.md
++++ b/docs/roadmap-baseline/01-services.md
@@@ -8,23 +8,23 @@ Deliverable 1: runtimes, ports, units, env files and repository state.
| Service | Repo | Stage | Ports | Units | Env file | Deployed | Databases |
|---|---|---|---|---|---|---|---|
--| network | OpenVibe.Network | live | http 4000 | openvibe-network.service | /etc/openvibe/network.env | 9b4e262 | data/network.db |
--| live | OpenVibe.Live | live | http 3000, rtmp 1935/9935, mediasoup 11000-11300/udp, jsmpegRelayTls 9710-9789 | openvibe-live.socket, openvibe-live.service | /etc/openvibe/live.env | 24151bd | data/live.db, data/analytics.db, data/rs-companion.db |
--| media | OpenVibe.Media | partial | http 4100, rtpIngest 12000-12199/udp (127.0.0.1) | openvibe-media.service | /etc/openvibe/media.env | 6114bc6 | data/media.db |
++| network | OpenVibe.Network | live | http 4000 | openvibe-network.service | /etc/openvibe/network.env | 1b79576 | data/network.db |
++| live | OpenVibe.Live | live | http 3000, rtmp 1935/9935, mediasoup 11000-11300/udp, jsmpegRelayTls 9710-9789 | openvibe-live.socket, openvibe-live.service | /etc/openvibe/live.env | e266060 | data/live.db, data/analytics.db, data/rs-companion.db |
++| media | OpenVibe.Media | partial | http 4100, rtpIngest 12000-12199/udp (127.0.0.1) | openvibe-media.service | /etc/openvibe/media.env | ddfefcf | data/media.db |
| tools | OpenVibe.Tools | live | gateway 4001, maps 4010, food 4011, img 4012, yt 4013, audio 4014, text 4015, docs 4016 | openvibe-tools.service, openvibe-tools-maps.service, openvibe-tools-food.service, openvibe-tools-img.service, openvibe-tools-yt.service, openvibe-tools-audio.service, openvibe-tools-text.service, openvibe-tools-docs.service | /etc/openvibe/tools.env | 0346edc | apps/<satellite>/data/analytics.db |
| games | OpenVibe.Games | live | http 8000 | openvibe-games.service | /etc/openvibe/games.env | 43c11f0 | data/world.db |
--| community | OpenVibe.Community | partial | http 4200 | openvibe-community.service | /etc/openvibe/community.env | de947ea | none |
++| community | OpenVibe.Community | partial | http 4200 | openvibe-community.service | /etc/openvibe/community.env | d7c6e60 | none |
| sites | OpenVibe.Sites | placeholder-host | | - | - | 185014f | none |
## Scanned repositories
| Repo | HEAD | origin/main | Source files | LOC | Test files | CI | Routes | Tables | WS servers | Timers/jobs | TODO(contract) |
|---|---|---|---|---|---|---|---|---|---|---|---|
--| OpenVibe.Live | 24151bd | 24151bd | 165 | 69699 | 56 | no | 532 | 125 | 8 | 48 | 15 |
--| OpenVibe.Network | 9b4e262 | 9b4e262 | 79 | 20646 | 18 | no | 187 | 36 | 0 | 11 | 0 |
--| OpenVibe.Media | 6114bc6 | 6114bc6 | 28 | 8702 | 4 | no | 67 | 15 | 0 | 9 | 0 |
++| OpenVibe.Live | e266060 | e266060 | 167 | 69978 | 58 | yes | 537 | 125 | 8 | 48 | 15 |
++| OpenVibe.Network | 1b79576 | 1b79576 | 81 | 21029 | 20 | yes | 197 | 39 | 0 | 11 | 0 |
++| OpenVibe.Media | ddfefcf | ddfefcf | 28 | 8752 | 6 | yes | 67 | 15 | 0 | 9 | 0 |
| OpenVibe.Tools | 0346edc | 0346edc | 117 | 20018 | 2 | no | 99 | 4 | 0 | 12 | 0 |
--| OpenVibe.Community | de947ea | de947ea | 11 | 1754 | 8 | no | 22 | 4 | 0 | 0 | 0 |
++| OpenVibe.Community | d7c6e60 | d7c6e60 | 21 | 3950 | 14 | yes | 47 | 13 | 0 | 1 | 0 |
| OpenVibe.Games | 5710287 | 5710287 | 101 | 18511 | 56 | no | 21 | 5 | 2 | 2 | 0 |
| OpenVibe.Sites | 185014f | 185014f | 1 | 306 | 0 | no | 0 | 0 | 0 | 0 | 0 |
@@@ -43,17 +43,17 @@ LOC counts non-test source files in the scanned directories only (`server/`, `ap
| OpenVibe.Blog | PUBLIC | placeholder (no code) | 2026-09-21 | 13 KB | The official OpenVibe blog and a blog for every member: drafts, revisions, series, scheduling, feeds. |
| OpenVibe.Chat | PUBLIC | placeholder (no code) | 2026-09-21 | 13 KB | Rooms, messages, DMs, calls, TTS and audio queues, moderation and presence — one identity, every conversation. |
| OpenVibe.Codes | PUBLIC | placeholder (no code) | 2026-09-21 | 13 KB | The developer portal: registry and contract explorers, credentials, playgrounds, examples, mod/app publishing, governance. |
--| OpenVibe.Community | PUBLIC | - | 2026-09-21 | 687 KB | |
--| OpenVibe.Contracts | PUBLIC | alpha | 2026-09-22 | 13 KB | Machine-readable contracts for the whole OpenVibe network. |
++| OpenVibe.Community | PUBLIC | - | 2026-09-22 | 689 KB | |
++| OpenVibe.Contracts | PUBLIC | alpha | 2026-09-22 | 89 KB | Machine-readable contracts for the whole OpenVibe network. |
| OpenVibe.Coupons | PUBLIC | placeholder (no code) | 2026-09-21 | 13 KB | Coupon codes with merchant matching, restrictions, expiry and real-people validity reports. |
| OpenVibe.Deals | PUBLIC | placeholder (no code) | 2026-09-21 | 13 KB | Deals submitted and voted on by the community, with source, price and freshness always shown. |
| OpenVibe.Events | PUBLIC | placeholder (no code) | 2026-09-21 | 13 KB | Durable events, subscriptions, delivery, retry, dead letters and replay for the network. |
| OpenVibe.Examples | PUBLIC | placeholder (no code) | 2026-09-21 | 13 KB | Executable public integration examples, tested in CI against the platform. |
| OpenVibe.Games | PUBLIC | - | 2026-09-21 | 4675 KB | |
| OpenVibe.Host | PUBLIC | placeholder (no code) | 2026-09-21 | 13 KB | The network's deployment/control plane first; then isolated hosting for community sites, bots and mods. |
--| OpenVibe.Live | PUBLIC | - | 2026-09-22 | 6455 KB | |
--| OpenVibe.Media | PUBLIC | - | 2026-09-21 | 847 KB | |
--| OpenVibe.Network | PUBLIC | - | 2026-09-22 | 1037 KB | |
++| OpenVibe.Live | PUBLIC | - | 2026-09-22 | 6507 KB | |
++| OpenVibe.Media | PUBLIC | - | 2026-09-22 | 847 KB | |
++| OpenVibe.Network | PUBLIC | - | 2026-09-22 | 1306 KB | |
| OpenVibe.News | PUBLIC | placeholder (no code) | 2026-09-21 | 13 KB | Source-backed stories: clustered coverage, cited summaries, perspectives and timelines. |
| OpenVibe.Realtime | PUBLIC | placeholder (no code) | 2026-09-21 | 13 KB | Browser delivery plane for events: authorised WS/SSE topics with cursors, resume and presence. |
| OpenVibe.Reviews | PUBLIC | placeholder (no code) | 2026-09-21 | 13 KB | Review signals gathered across sources with provenance, entity resolution and honest aggregates. |
ddiff --git a/docs/roadmap-baseline/02-schema.md b/docs/roadmap-baseline/02-schema.md
iindex b2940700..168b8440 100644
---- a/docs/roadmap-baseline/02-schema.md
++++ b/docs/roadmap-baseline/02-schema.md
@@@ -8,6 +8,7 @@ Deliverable 2: every table declared in code or present in production, with curre
| File | Size | Tables |
|---|---|---|
++| /opt/openvibe.community/data/community.db | 115 KB | 9 |
| /opt/openvibe.games/data/world.db | 74 KB | 5 |
| /opt/openvibe.live/data/backups/live-pre-643a2e6.db | 264.7 MB | 145 |
| /opt/openvibe.live/data/openvibe.db | 0 B | 0 |
@@@ -16,7 +17,7 @@ Deliverable 2: every table declared in code or present in production, with curre
| /opt/openvibe.live/data/live.db | 279.2 MB | 146 |
| /opt/openvibe.live/data/rs-companion.db | 8.6 MB | 33 |
| /opt/openvibe.media/data/media.db | 5.6 MB | 11 |
--| /opt/openvibe.network/data/network.db | 766.5 MB | 35 |
++| /opt/openvibe.network/data/network.db | 766.5 MB | 38 |
| /opt/openvibe.tools/apps/audio/data/analytics.db | 59.9 MB | 4 |
| /opt/openvibe.tools/apps/img/data/analytics.db | 5.5 MB | 4 |
| /opt/openvibe.tools/apps/docs/data/analytics.db | 1.5 MB | 4 |
@@@ -216,7 +217,7 @@ Deliverable 2: every table declared in code or present in production, with curre
| watch_time | server/db/schema.sql:706 | live.db | OpenVibe.Live | keep | - |
| woodcut_profile | (prod only) | rs-companion.db | OpenVibe.Games (import source) | frozen-legacy | W12 |
--## OpenVibe.Network (36)
++## OpenVibe.Network (39)
| Table | Declared at | In prod | Target owner | Disposition | Wave |
|---|---|---|---|---|---|
@@@ -243,14 +244,17 @@ Deliverable 2: every table declared in code or present in production, with curre
| oauth_codes | server/db/database.js:144 | network.db | OpenVibe.Network | keep | W1 (module split) |
| oauth_tokens | server/db/database.js:158 | network.db | OpenVibe.Network | keep | W1 (module split) |
| password_reset_tokens | server/db/database.js:321 | network.db | OpenVibe.Network | keep | W1 (module split) |
++| principal_grants | server/identity/principals.js:44 | network.db | OpenVibe.Network | keep | W1 (module split) |
++| principal_usage | server/identity/principals.js:54 | network.db | OpenVibe.Network | keep | W1 (module split) |
| push_subscriptions | server/db/database.js:460 | network.db | OpenVibe.Network | keep | W3 (delivery -> Events outbox) |
| site_settings | server/db/database.js:238 | network.db | OpenVibe.Network | keep | - |
--| stream_live_announcements | server/internal/routes.js:310 | network.db | OpenVibe.Events | extract | W3 |
++| stream_live_announcements | server/internal/routes.js:325 | network.db | OpenVibe.Events | extract | W3 |
| themes | server/db/database.js:183 | network.db | OpenVibe.Network | keep | W1 (module split) |
| tool_domains | server/domains/routes.js:44 | network.db | OpenVibe.Network | keep | W1 (module split) |
| url_registry | server/db/database.js:245, server/url-registry.js:7 | network.db | OpenVibe.Network | keep | W1 (module split) |
| user_effects | server/db/database.js:375 | network.db | OpenVibe.Network | keep | W1 (module split) |
| user_history | server/history/routes.js:26 | network.db | OpenVibe.Network | keep | W1 (module split) |
++| user_modules | server/identity/modules.js:24 | network.db | OpenVibe.Network | keep | W1 (module split) |
| user_preferences | server/db/database.js:172 | network.db | OpenVibe.Network | keep | W1 (module split) |
| user_sessions | server/db/database.js:354 | network.db | OpenVibe.Network | keep | W1 (module split) |
| users | server/db/database.js:113 | network.db | OpenVibe.Network | keep | W1 (module split) |
@@@ -286,7 +290,7 @@ Deliverable 2: every table declared in code or present in production, with curre
| analytics_hourly | vendor/openvibe-shared/analytics.js:98 | analytics.db | OpenVibe.Tools | keep | Track O / ADR-021 |
| analytics_rate_tracking | vendor/openvibe-shared/analytics.js:137 | analytics.db | OpenVibe.Tools | keep | Track O / ADR-021 |
--## OpenVibe.Community (4)
++## OpenVibe.Community (13)
| Table | Declared at | In prod | Target owner | Disposition | Wave |
|---|---|---|---|---|---|
@@@ -294,6 +298,15 @@ Deliverable 2: every table declared in code or present in production, with curre
| analytics_events | vendor/openvibe-shared/analytics.js:74 | no | OpenVibe.Community | keep | Track O / ADR-021 |
| analytics_hourly | vendor/openvibe-shared/analytics.js:98 | no | OpenVibe.Community | keep | Track O / ADR-021 |
| analytics_rate_tracking | vendor/openvibe-shared/analytics.js:137 | no | OpenVibe.Community | keep | Track O / ADR-021 |
++| import_hold | server/db.js:125 | community.db | OpenVibe.Community | keep | W5 |
++| legacy_id_map | server/db.js:116 | community.db | OpenVibe.Community | keep | W5 |
++| migration_runs | server/db.js:108 | community.db | OpenVibe.Community | keep | W5 |
++| paste_comments | server/db.js:72 | community.db | OpenVibe.Community | keep | W5 |
++| paste_likes | server/db.js:65 | community.db | OpenVibe.Community | keep | W5 |
++| paste_versions | server/db.js:54 | community.db | OpenVibe.Community | keep | W5 |
++| paste_visits | server/db.js:88 | community.db | OpenVibe.Community | keep | W5 |
++| pastes | server/db.js:18 | community.db | OpenVibe.Community | keep | W5 |
++| subject_projection | server/db.js:98 | community.db | OpenVibe.Community | keep | W5 |
## OpenVibe.Games (5)
ddiff --git a/docs/roadmap-baseline/03-routes.md b/docs/roadmap-baseline/03-routes.md
iindex 513eb6b4..6faf334d 100644
---- a/docs/roadmap-baseline/03-routes.md
++++ b/docs/roadmap-baseline/03-routes.md
@@@ -8,11 +8,11 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t
| Repo | Routes | GET | POST | PUT/PATCH | DELETE | Other | /internal/* |
|---|---|---|---|---|---|---|---|
--| OpenVibe.Live | 532 | 274 | 160 | 50 | 47 | 1 | 6 |
--| OpenVibe.Network | 187 | 81 | 70 | 22 | 14 | 0 | 27 |
++| OpenVibe.Live | 537 | 275 | 163 | 50 | 48 | 1 | 6 |
++| OpenVibe.Network | 197 | 86 | 72 | 24 | 15 | 0 | 30 |
| OpenVibe.Media | 67 | 28 | 27 | 4 | 8 | 0 | 1 |
| OpenVibe.Tools | 99 | 84 | 12 | 0 | 2 | 1 | 0 |
--| OpenVibe.Community | 22 | 19 | 3 | 0 | 0 | 0 | 0 |
++| OpenVibe.Community | 47 | 30 | 13 | 1 | 3 | 0 | 0 |
| OpenVibe.Games | 21 | 0 | 3 | 0 | 0 | 18 | 0 |
@@@ -359,6 +359,7 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t
| GET | /api/pastes/:slug | server/media-proxy/pastes.js:215 |
| PUT | /api/pastes/:slug | server/media-proxy/pastes.js:216 |
| POST | /api/pastes/:slug/censor | server/media-proxy/pastes.js:222 |
++| POST | /api/pastes/:slug/censor | server/media-proxy/pastes.js:315 |
| GET | /api/pastes/:slug/comments | server/media-proxy/pastes.js:243 |
| POST | /api/pastes/:slug/comments | server/media-proxy/pastes.js:246 |
| DELETE | /api/pastes/:slug/comments/:commentId | server/media-proxy/pastes.js:248 |
@@@ -366,10 +367,14 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t
| POST | /api/pastes/:slug/fork | server/media-proxy/pastes.js:238 |
| POST | /api/pastes/:slug/like | server/media-proxy/pastes.js:241 |
| GET | /api/pastes/:slug/raw | server/media-proxy/pastes.js:240 |
++| GET | /api/pastes/:slug/raw | server/media-proxy/pastes.js:311 |
| POST | /api/pastes/:slug/set-avatar | server/media-proxy/pastes.js:110 |
++| POST | /api/pastes/:slug/set-avatar | server/media-proxy/pastes.js:296 |
| DELETE | /api/pastes/admin/forks | server/media-proxy/pastes.js:171 |
++| DELETE | /api/pastes/admin/forks | server/media-proxy/pastes.js:313 |
| GET | /api/pastes/admin/stats | server/media-proxy/pastes.js:170 |
| POST | /api/pastes/bulk | server/media-proxy/pastes.js:172 |
++| POST | /api/pastes/bulk | server/media-proxy/pastes.js:314 |
| GET | /api/pastes/by-user/:username | server/media-proxy/pastes.js:177 |
| GET | /api/pastes/config | server/media-proxy/pastes.js:169 |
| POST | /api/pastes/screenshot | server/media-proxy/pastes.js:83 |
@@@ -563,7 +568,7 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t
| PUT | / | server/discord/routes.js:33 |
| POST | /:id/dismiss | server/notifications/routes.js:100 |
| POST | /:id/read | server/notifications/routes.js:67 |
--| GET | /.well-known/web-identity | server/index.js:572 |
++| GET | /.well-known/web-identity | server/index.js:574 |
| POST | /admin | server/setup/routes.js:114 |
| GET | /api/.well-known/jwks | server/index.js:356 |
| GET | /api/admin/domains | server/domains/routes.js:176 |
@@@ -573,7 +578,7 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t
| PUT | /api/admin/domains/:id | server/domains/routes.js:238 |
| GET | /api/admin/domains/catalog | server/domains/routes.js:206 |
| POST | /api/admin/domains/check | server/domains/routes.js:217 |
--| GET | /api/admin/ssh-info | server/index.js:452 |
++| GET | /api/admin/ssh-info | server/index.js:454 |
| GET | /api/auth/anon-identities | server/auth/routes.js:638 |
| POST | /api/auth/anon-session | server/auth/routes.js:515 |
| GET | /api/auth/anon/:token | server/auth/routes.js:585 |
@@@ -604,7 +609,7 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t
| DELETE | /api/auth/users/:id/follow | server/auth/routes.js:814 |
| POST | /api/auth/users/:id/follow | server/auth/routes.js:783 |
| GET | /api/brand | server/index.js:373 |
--| GET | /api/catalog.json | server/index.js:423 |
++| GET | /api/catalog.json | server/index.js:425 |
| GET | /api/chrome | server/chrome/service.js:137 |
| POST | /api/chrome/hit | server/chrome/service.js:150 |
| GET | /api/domains | server/domains/routes.js:176 |
@@@ -620,6 +625,13 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t
| POST | /api/history | server/history/routes.js:108 |
| DELETE | /api/history/:id | server/history/routes.js:148 |
| PUT | /api/history/settings | server/history/routes.js:137 |
++| GET | /api/modules | server/identity/modules.js:101 |
++| DELETE | /api/modules/:ns | server/identity/modules.js:126 |
++| GET | /api/modules/:ns | server/identity/modules.js:109 |
++| PUT | /api/modules/:ns | server/identity/modules.js:117 |
++| GET | /api/modules/:ns/public/:subject | server/identity/modules.js:93 |
++| GET | /api/modules/modules/:ns/:subject | server/identity/modules.js:140 |
++| PUT | /api/modules/modules/:ns/:subject | server/identity/modules.js:149 |
| DELETE | /api/profile/avatar | server/profile/avatar.js:107 |
| PUT | /api/profile/avatar | server/profile/avatar.js:96 |
| GET | /api/profile/avatar/:username | server/profile/avatar.js:110 |
@@@ -628,7 +640,7 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t
| POST | /api/push/subscribe | server/push/routes.js:17 |
| POST | /api/push/unsubscribe | server/push/routes.js:29 |
| GET | /api/push/vapid-key | server/push/routes.js:10 |
--| GET | /api/sso/targets | server/index.js:405 |
++| GET | /api/sso/targets | server/index.js:407 |
| GET | /api/themes | server/themes/routes.js:41 |
| POST | /api/themes | server/themes/routes.js:148 |
| GET | /api/themes/:idOrSlug | server/themes/routes.js:109 |
@@@ -664,34 +676,37 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t
| POST | /fedcm/disconnect | server/auth/fedcm.js:142 |
| GET | /health | server/admin/routes.js:766 |
| POST | /identity | server/setup/routes.js:152 |
--| GET | /internal/anon-admin | server/internal/routes.js:628 |
--| GET | /internal/anon-list | server/internal/routes.js:677 |
--| POST | /internal/audit | server/internal/routes.js:166 |
--| POST | /internal/coins/credit | server/internal/routes.js:252 |
--| POST | /internal/coins/debit | server/internal/routes.js:264 |
--| GET | /internal/coins/stats | server/internal/routes.js:214 |
--| POST | /internal/coins/transfer | server/internal/routes.js:277 |
--| POST | /internal/events/stream-live | server/internal/routes.js:294 |
--| POST | /internal/identity/legacy-map | server/identity/internal-routes.js:29 |
++| GET | /internal/anon-admin | server/internal/routes.js:643 |
++| GET | /internal/anon-list | server/internal/routes.js:692 |
++| POST | /internal/audit | server/internal/routes.js:178 |
++| POST | /internal/coins/credit | server/internal/routes.js:267 |
++| POST | /internal/coins/debit | server/internal/routes.js:279 |
++| GET | /internal/coins/stats | server/internal/routes.js:226 |
++| POST | /internal/coins/transfer | server/internal/routes.js:292 |
++| POST | /internal/events/stream-live | server/internal/routes.js:309 |
++| POST | /internal/identity/legacy-map | server/identity/internal-routes.js:52 |
| GET | /internal/identity/resolve | server/identity/internal-routes.js:18 |
--| POST | /internal/issue-token | server/internal/routes.js:518 |
--| POST | /internal/link-account | server/internal/routes.js:108 |
--| POST | /internal/notifications/mark-read | server/internal/routes.js:479 |
--| POST | /internal/notifications/push | server/internal/routes.js:421 |
--| POST | /internal/notifications/push-bulk | server/internal/routes.js:441 |
--| POST | /internal/notifications/resolve-users | server/internal/routes.js:498 |
--| GET | /internal/notifications/unread/:userId | server/internal/routes.js:464 |
--| POST | /internal/resolve-anon | server/internal/routes.js:549 |
--| GET | /internal/stats | server/internal/routes.js:175 |
--| GET | /internal/url-registry/resolved | server/internal/routes.js:184 |
--| POST | /internal/user-avatar | server/internal/routes.js:151 |
--| GET | /internal/users/:id | server/internal/routes.js:59 |
--| GET | /internal/users/:id/linked-accounts | server/internal/routes.js:159 |
--| GET | /internal/users/:id/theme | server/internal/routes.js:96 |
--| POST | /internal/users/bulk | server/internal/routes.js:81 |
--| GET | /internal/users/by-username/:username | server/internal/routes.js:70 |
--| POST | /internal/verify-token | server/internal/routes.js:37 |
--| GET | /llms.txt | server/index.js:550 |
++| GET | /internal/identity/resolve | server/internal/routes.js:40 |
++| POST | /internal/identity/resolve-batch | server/identity/internal-routes.js:35 |
++| POST | /internal/identity/resolve-batch | server/internal/routes.js:41 |
++| POST | /internal/issue-token | server/internal/routes.js:533 |
++| POST | /internal/link-account | server/internal/routes.js:120 |
++| POST | /internal/notifications/mark-read | server/internal/routes.js:494 |
++| POST | /internal/notifications/push | server/internal/routes.js:436 |
++| POST | /internal/notifications/push-bulk | server/internal/routes.js:456 |
++| POST | /internal/notifications/resolve-users | server/internal/routes.js:513 |
++| GET | /internal/notifications/unread/:userId | server/internal/routes.js:479 |
++| POST | /internal/resolve-anon | server/internal/routes.js:564 |
++| GET | /internal/stats | server/internal/routes.js:187 |
++| GET | /internal/url-registry/resolved | server/internal/routes.js:196 |
++| POST | /internal/user-avatar | server/internal/routes.js:163 |
++| GET | /internal/users/:id | server/internal/routes.js:71 |
++| GET | /internal/users/:id/linked-accounts | server/internal/routes.js:171 |
++| GET | /internal/users/:id/theme | server/internal/routes.js:108 |
++| POST | /internal/users/bulk | server/internal/routes.js:93 |
++| GET | /internal/users/by-username/:username | server/internal/routes.js:82 |
++| POST | /internal/verify-token | server/internal/routes.js:49 |
++| GET | /llms.txt | server/index.js:552 |
| GET | /me | server/coins/routes.js:18 |
| GET | /me/history | server/coins/routes.js:24 |
| GET | /net-config | server/admin/routes.js:907 |
@@@ -702,11 +717,11 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t
| GET | /nginx/preview/:serviceId | server/deploy/routes.js:314 |
| POST | /nginx/reload | server/deploy/routes.js:382 |
| POST | /nginx/validate | server/deploy/routes.js:330 |
--| GET | /oauth/.well-known/openid-configuration | server/auth/oauth-routes.js:306 |
--| GET | /oauth/authorize | server/auth/oauth-routes.js:21 |
--| POST | /oauth/confirm | server/auth/oauth-routes.js:79 |
--| POST | /oauth/token | server/auth/oauth-routes.js:132 |
--| GET | /openvibe-sw.js | server/index.js:596 |
++| GET | /oauth/.well-known/openid-configuration | server/auth/oauth-routes.js:318 |
++| GET | /oauth/authorize | server/auth/oauth-routes.js:22 |
++| POST | /oauth/confirm | server/auth/oauth-routes.js:80 |
++| POST | /oauth/token | server/auth/oauth-routes.js:133 |
++| GET | /openvibe-sw.js | server/index.js:598 |
| GET | /overview | server/admin/analytics-routes.js:75 |
| GET | /preferences | server/notifications/routes.js:121 |
| PUT | /preferences | server/notifications/routes.js:132 |
@@@ -720,11 +735,11 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t
| GET | /service/:name | server/admin/analytics-routes.js:224 |
| GET | /settings | server/admin/routes.js:300 |
| PUT | /settings | server/admin/routes.js:328 |
--| GET | /sso/check | server/index.js:577 |
++| GET | /sso/check | server/index.js:579 |
| GET | /status | server/setup/routes.js:91 |
| POST | /test | server/discord/routes.js:77 |
| POST | /test-live | server/discord/routes.js:87 |
--| GET | /tos | server/index.js:419 |
++| GET | /tos | server/index.js:421 |
| GET | /unread-by-category | server/notifications/routes.js:47 |
| GET | /unread-count | server/notifications/routes.js:37 |
| GET | /url-registry | server/admin/routes.js:353 |
@@@ -743,7 +758,7 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t
| GET | /verification-keys | server/admin/routes.js:824 |
| POST | /verification-keys | server/admin/routes.js:833 |
| DELETE | /verification-keys/:id | server/admin/routes.js:881 |
--| GET | /verify-email | server/index.js:562 |
++| GET | /verify-email | server/index.js:564 |
## OpenVibe.Media
@@@ -771,26 +786,26 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t
| POST | /api/v1/:app/files | server/files/routes.js:75 |
| DELETE | /api/v1/:app/files/:key | server/files/routes.js:167 |
| GET | /api/v1/:app/files/:key | server/files/routes.js:156 |
--| GET | /api/v1/:app/pastes | server/pastes/routes.js:248 |
--| POST | /api/v1/:app/pastes | server/pastes/routes.js:462 |
--| DELETE | /api/v1/:app/pastes/:slug | server/pastes/routes.js:616 |
--| GET | /api/v1/:app/pastes/:slug | server/pastes/routes.js:436 |
--| PUT | /api/v1/:app/pastes/:slug | server/pastes/routes.js:578 |
--| POST | /api/v1/:app/pastes/:slug/ai | server/pastes/routes.js:558 |
--| POST | /api/v1/:app/pastes/:slug/censor | server/pastes/routes.js:397 |
--| GET | /api/v1/:app/pastes/:slug/comments | server/pastes/routes.js:702 |
--| POST | /api/v1/:app/pastes/:slug/comments | server/pastes/routes.js:725 |
--| DELETE | /api/v1/:app/pastes/:slug/comments/:commentId | server/pastes/routes.js:803 |
--| POST | /api/v1/:app/pastes/:slug/copy | server/pastes/routes.js:677 |
--| POST | /api/v1/:app/pastes/:slug/fork | server/pastes/routes.js:634 |
--| POST | /api/v1/:app/pastes/:slug/like | server/pastes/routes.js:660 |
--| DELETE | /api/v1/:app/pastes/admin/forks | server/pastes/routes.js:359 |
--| GET | /api/v1/:app/pastes/admin/forks | server/pastes/routes.js:339 |
--| GET | /api/v1/:app/pastes/admin/stats | server/pastes/routes.js:329 |
--| POST | /api/v1/:app/pastes/bulk | server/pastes/routes.js:372 |
--| GET | /api/v1/:app/pastes/config | server/pastes/routes.js:307 |
--| GET | /api/v1/:app/stats | server/index.js:93 |
--| GET | /api/v1/:app/stats/series/:metric | server/index.js:103 |
++| GET | /api/v1/:app/pastes | server/pastes/routes.js:257 |
++| POST | /api/v1/:app/pastes | server/pastes/routes.js:471 |
++| DELETE | /api/v1/:app/pastes/:slug | server/pastes/routes.js:625 |
++| GET | /api/v1/:app/pastes/:slug | server/pastes/routes.js:445 |
++| PUT | /api/v1/:app/pastes/:slug | server/pastes/routes.js:587 |
++| POST | /api/v1/:app/pastes/:slug/ai | server/pastes/routes.js:567 |
++| POST | /api/v1/:app/pastes/:slug/censor | server/pastes/routes.js:406 |
++| GET | /api/v1/:app/pastes/:slug/comments | server/pastes/routes.js:711 |
++| POST | /api/v1/:app/pastes/:slug/comments | server/pastes/routes.js:734 |
++| DELETE | /api/v1/:app/pastes/:slug/comments/:commentId | server/pastes/routes.js:812 |
++| POST | /api/v1/:app/pastes/:slug/copy | server/pastes/routes.js:686 |
++| POST | /api/v1/:app/pastes/:slug/fork | server/pastes/routes.js:643 |
++| POST | /api/v1/:app/pastes/:slug/like | server/pastes/routes.js:669 |
++| DELETE | /api/v1/:app/pastes/admin/forks | server/pastes/routes.js:368 |
++| GET | /api/v1/:app/pastes/admin/forks | server/pastes/routes.js:348 |
++| GET | /api/v1/:app/pastes/admin/stats | server/pastes/routes.js:338 |
++| POST | /api/v1/:app/pastes/bulk | server/pastes/routes.js:381 |
++| GET | /api/v1/:app/pastes/config | server/pastes/routes.js:316 |
++| GET | /api/v1/:app/stats | server/index.js:94 |
++| GET | /api/v1/:app/stats/series/:metric | server/index.js:104 |
| POST | /api/v1/:app/thumbnails/:kind/:id | server/thumbnails/routes.js:38 |
| GET | /api/v1/:app/views | server/views/routes.js:39 |
| POST | /api/v1/:app/views | server/views/routes.js:24 |
@@@ -812,10 +827,10 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t
| GET | /auth/logout | server/user-auth.js:355 |
| GET | /auth/me | server/user-auth.js:379 |
| POST | /auth/refresh | server/user-auth.js:389 |
--| GET | /healthz | server/index.js:82 |
--| POST | /internal/avatar-ingest | server/index.js:56 |
--| GET | /manifest.webmanifest | server/index.js:44 |
--| GET | /tos | server/index.js:41 |
++| GET | /healthz | server/index.js:83 |
++| POST | /internal/avatar-ingest | server/index.js:57 |
++| GET | /manifest.webmanifest | server/index.js:45 |
++| GET | /tos | server/index.js:42 |
## OpenVibe.Tools
@@@ -925,28 +940,53 @@ Deliverable 3 (routes half). Paths include the prefix of the `app.use()` mount t
| Method | Path | Source |
|---|---|---|
--| GET | / | server/app.js:106 |
--| GET | /api/health | server/app.js:81 |
--| GET | /api/ready | server/app.js:82 |
--| GET | /callback | server/auth/routes.js:281 |
--| POST | /fedcm | server/auth/routes.js:327 |
--| GET | /feed.xml | server/app.js:99 |
--| GET | /login | server/auth/routes.js:259 |
--| GET | /logout | server/auth/routes.js:355 |
--| GET | /me | server/auth/routes.js:379 |
--| GET | /my | server/app.js:186 |
--| GET | /new | server/app.js:150 |
--| POST | /new | server/app.js:159 |
--| GET | /p/:slug | server/app.js:119 |
--| GET | /p/:slug/download | server/app.js:138 |
--| GET | /p/:slug/raw | server/app.js:135 |
--| GET | /p/:slug/screenshot | server/app.js:136 |
--| GET | /pastes | server/app.js:111 |
--| GET | /pastes/:slug | server/app.js:117 |
--| POST | /refresh | server/auth/routes.js:389 |
--| GET | /robots.txt | server/app.js:97 |
--| GET | /sitemap.xml | server/app.js:98 |
--| GET | /tos | server/app.js:75 |
++| GET | / | server/app.js:146 |
++| GET | /api/health | server/app.js:120 |
++| GET | /api/pastes | server/pastes/api.js:102 |
++| POST | /api/pastes | server/pastes/api.js:106 |
++| DELETE | /api/pastes/:slug | server/pastes/api.js:124 |
++| GET | /api/pastes/:slug | server/pastes/api.js:122 |
++| PUT | /api/pastes/:slug | server/pastes/api.js:123 |
++| POST | /api/pastes/:slug/ai | server/pastes/api.js:127 |
++| POST | /api/pastes/:slug/censor | server/pastes/api.js:126 |
++| GET | /api/pastes/:slug/comments | server/pastes/api.js:136 |
++| POST | /api/pastes/:slug/comments | server/pastes/api.js:137 |
++| DELETE | /api/pastes/:slug/comments/:commentId | server/pastes/api.js:140 |
++| POST | /api/pastes/:slug/copy | server/pastes/api.js:134 |
++| POST | /api/pastes/:slug/fork | server/pastes/api.js:132 |
++| POST | /api/pastes/:slug/like | server/pastes/api.js:133 |
++| GET | /api/pastes/:slug/raw | server/pastes/api.js:129 |
++| POST | /api/pastes/:slug/set-avatar | server/pastes/api.js:143 |
++| GET | /api/pastes/:slug/versions | server/pastes/api.js:130 |
++| DELETE | /api/pastes/admin/forks | server/pastes/api.js:113 |
++| GET | /api/pastes/admin/forks | server/pastes/api.js:112 |
++| GET | /api/pastes/admin/stats | server/pastes/api.js:111 |
++| POST | /api/pastes/bulk | server/pastes/api.js:114 |
++| GET | /api/pastes/by-user/:username | server/pastes/api.js:119 |
++| GET | /api/pastes/config | server/pastes/api.js:109 |
++| POST | /api/pastes/screenshot | server/pastes/api.js:116 |
++| GET | /api/ready | server/app.js:121 |
++| GET | /callback | server/auth/routes.js:289 |
++| POST | /fedcm | server/auth/routes.js:335 |
++| GET | /feed.xml | server/app.js:138 |
++| GET | /login | server/auth/routes.js:267 |
++| GET | /logout | server/auth/routes.js:363 |
++| GET | /me | server/auth/routes.js:387 |
++| GET | /my | server/app.js:252 |
++| GET | /new | server/app.js:214 |
++| POST | /new | server/app.js:225 |
++| GET | /p/:slug | server/app.js:159 |
++| GET | /p/:slug/download | server/app.js:202 |
++| GET | /p/:slug/raw | server/app.js:178 |
++| GET | /p/:slug/raw | server/app.js:198 |
++| GET | /p/:slug/screenshot | server/app.js:191 |
++| GET | /p/:slug/screenshot | server/app.js:199 |
++| GET | /pastes | server/app.js:151 |
++| GET | /pastes/:slug | server/app.js:157 |
++| POST | /refresh | server/auth/routes.js:397 |
++| GET | /robots.txt | server/app.js:136 |
++| GET | /sitemap.xml | server/app.js:137 |
++| GET | /tos | server/app.js:82 |
## OpenVibe.Games
ddiff --git a/docs/roadmap-baseline/04-cross-service.md b/docs/roadmap-baseline/04-cross-service.md
iindex c0d59159..21d7c99b 100644
---- a/docs/roadmap-baseline/04-cross-service.md
++++ b/docs/roadmap-baseline/04-cross-service.md
@@@ -12,9 +12,9 @@ Deliverable 3 (dependency half). A call site is a source file that makes HTTP re
| OpenVibe.Community | OpenVibe.Media | 1 | bearer |
| OpenVibe.Community | OpenVibe.Network | 5 | bearer, internal-key, oauth-client |
| OpenVibe.Games | OpenVibe.Network | 2 | bearer, oauth-client |
--| OpenVibe.Live | OpenVibe.Community | 1 | none-detected |
++| OpenVibe.Live | OpenVibe.Community | 3 | none-detected |
| OpenVibe.Live | OpenVibe.Media | 2 | api-key, bearer, internal-key |
--| OpenVibe.Live | OpenVibe.Network | 12 | bearer, hmac, internal-key, oauth-client |
++| OpenVibe.Live | OpenVibe.Network | 13 | bearer, hmac, internal-key, none-detected, oauth-client |
| OpenVibe.Live | webhook | 2 | hmac, none-detected |
| OpenVibe.Media | OpenVibe.Live | 1 | none-detected |
| OpenVibe.Media | OpenVibe.Network | 6 | bearer, internal-key, none-detected, oauth-client |
@@@ -42,6 +42,8 @@ Deliverable 3 (dependency half). A call site is a source file that makes HTTP re
| Community/vendor/openvibe-shared/navbar.js:10 | OpenVibe.Network | /api/auth/me | bearer | **no** | yes |
| Games/apps/server/src/net/httpServer.ts:335 | OpenVibe.Network | /api/auth/me, /oauth/token | oauth-client | **no** | yes |
| Games/apps/server/src/net/networkAuth.ts:3 | OpenVibe.Network | /api/auth/me | bearer | **no** | no |
++| Live/server/media-proxy/pastes.js:311 | OpenVibe.Community | OV_COMMUNITY_URL | none-detected | yes | yes |
++| Live/server/pastes-client.js:16 | OpenVibe.Community | OV_COMMUNITY_INTERNAL_URL | none-detected | yes | yes |
| Live/server/seo/seo.js:424 | OpenVibe.Community | OV_COMMUNITY_URL | none-detected | **no** | no |
| Live/server/config.js:175 | OpenVibe.Media | MEDIA_URL, :4100 | internal-key | yes | no |
| Live/server/media-client.js:14 | OpenVibe.Media | :4100, MEDIA_URL, /api/v1/${ | api-key, bearer | yes | no |
@@@ -49,10 +51,11 @@ Deliverable 3 (dependency half). A call site is a source file that makes HTTP re
| Live/server/config.js:21 | OpenVibe.Network | :4000, OV_NETWORK_URL | internal-key | yes | no |
| Live/server/integrations/platform-oauth.js:52 | OpenVibe.Network | /oauth/token | bearer, hmac, oauth-client | **no** | yes |
| Live/server/integrations/powerchat-oauth.js:51 | OpenVibe.Network | /oauth/token | bearer, hmac, oauth-client | **no** | yes |
--| Live/server/monetization/wallet-client.js:9 | OpenVibe.Network | /internal/coins, OV_NETWORK_INTERNAL_URL, :4000 | internal-key, bearer | yes | no |
++| Live/server/monetization/wallet-client.js:9 | OpenVibe.Network | /internal/coins, OV_NETWORK_INTERNAL_URL, :4000 | internal-key, bearer | yes | yes |
++| Live/server/pastes-client.js:39 | OpenVibe.Network | OV_NETWORK_INTERNAL_URL, :4000 | none-detected | yes | yes |
| Live/server/streaming/golive-notify.js:60 | OpenVibe.Network | /internal/events | internal-key | **no** | no |
| Live/server/streaming/restream-manager.js:1387 | OpenVibe.Network | /oauth/token | bearer, oauth-client | yes | yes |
--| Live/server/utils/notify.js:16 | OpenVibe.Network | OV_NETWORK_INTERNAL_URL, :4000, /internal/notifications | internal-key | **no** | no |
++| Live/server/utils/notify.js:16 | OpenVibe.Network | OV_NETWORK_INTERNAL_URL, :4000, /internal/notifications | internal-key | **no** | yes |
| Live/vendor/openvibe-shared/account-switcher.js:176 | OpenVibe.Network | /api/auth/me | bearer | **no** | yes |
| Live/vendor/openvibe-shared/auth-client.js:23 | OpenVibe.Network | :4000, /oauth/token | internal-key, oauth-client | **no** | no |
| Live/vendor/openvibe-shared/footer.js:280 | OpenVibe.Network | /api/auth/me | bearer | **no** | no |
@@@ -60,13 +63,13 @@ Deliverable 3 (dependency half). A call site is a source file that makes HTTP re
| Live/server/integrations/discord-webhook.js:16 | webhook | webhook_url (per-app, configured in DB) | none-detected | **no** | no |
| Live/server/media-proxy/webhook.js:38 | webhook | webhook_url (per-app, configured in DB) | hmac | yes | no |
| Media/server/thumbnails/live-frame-service.js:170 | OpenVibe.Live | :3000 | none-detected | yes | yes |
--| Media/server/auth.js:28 | OpenVibe.Network | network.url, /api/.well-known/jwks | none-detected | yes | yes |
++| Media/server/auth.js:29 | OpenVibe.Network | network.url, /api/.well-known/jwks | none-detected | yes | yes |
| Media/server/user-auth.js:49 | OpenVibe.Network | /api/.well-known/jwks, networkUrl, networkInternalUrl, /oauth/token | oauth-client | yes | yes |
| Media/vendor/openvibe-shared/account-switcher.js:176 | OpenVibe.Network | /api/auth/me | bearer | **no** | yes |
| Media/vendor/openvibe-shared/auth-client.js:23 | OpenVibe.Network | :4000, /oauth/token | internal-key, oauth-client | **no** | no |
| Media/vendor/openvibe-shared/footer.js:280 | OpenVibe.Network | /api/auth/me | bearer | **no** | no |
| Media/vendor/openvibe-shared/navbar.js:10 | OpenVibe.Network | /api/auth/me | bearer | **no** | yes |
--| Media/server/auth.js:268 | webhook | webhook_url (per-app, configured in DB) | none-detected | yes | yes |
++| Media/server/auth.js:305 | webhook | webhook_url (per-app, configured in DB) | none-detected | yes | yes |
| Media/server/webhooks.js:4 | webhook | webhook_url (per-app, configured in DB) | hmac | yes | yes |
| Network/server/admin/analytics-routes.js:24 | OpenVibe.Games | :8000 | internal-key, bearer | yes | no |
| Network/server/admin/routes.js:71 | OpenVibe.Games | games.internalUrl | internal-key | yes | no |
ddiff --git a/docs/roadmap-baseline/05-realtime-and-jobs.md b/docs/roadmap-baseline/05-realtime-and-jobs.md
iindex e8190ac6..5d9f8f5f 100644
---- a/docs/roadmap-baseline/05-realtime-and-jobs.md
++++ b/docs/roadmap-baseline/05-realtime-and-jobs.md
@@@ -101,18 +101,18 @@ Deliverable 4, plus the background-job half of the exit criteria.
| OpenVibe.Network | setInterval | | ? | server/auth/discord-link.js:20 |
| OpenVibe.Network | setInterval | | ? | server/chrome/service.js:167 |
| OpenVibe.Network | setInterval | | ? | server/chrome/service.js:169 |
--| OpenVibe.Network | setInterval | | 60 min | server/index.js:652 |
--| OpenVibe.Network | setInterval | | 2 min | server/index.js:655 |
--| OpenVibe.Network | setInterval | | ? | server/index.js:658 |
++| OpenVibe.Network | setInterval | | 60 min | server/index.js:654 |
++| OpenVibe.Network | setInterval | | 2 min | server/index.js:657 |
++| OpenVibe.Network | setInterval | | ? | server/index.js:660 |
| OpenVibe.Network | setInterval | | 15 min | packages/openvibe-shared/account-switcher.js:624 |
| OpenVibe.Network | setInterval | | 5 s | packages/openvibe-shared/analytics.js:238 |
| OpenVibe.Network | setInterval | | 60 min | packages/openvibe-shared/analytics.js:241 |
| OpenVibe.Network | setInterval | | ? | packages/openvibe-shared/analytics.js:247 |
| OpenVibe.Network | setInterval | | ? | packages/openvibe-shared/notification-ui.js:548 |
--| OpenVibe.Media | setInterval | | ? | server/auth.js:58 |
--| OpenVibe.Media | setInterval | | 720 min | server/index.js:115 |
--| OpenVibe.Media | setInterval | | ? | server/index.js:141 |
--| OpenVibe.Media | setInterval | | ? | server/pastes/routes.js:694 |
++| OpenVibe.Media | setInterval | | ? | server/auth.js:59 |
++| OpenVibe.Media | setInterval | | 720 min | server/index.js:116 |
++| OpenVibe.Media | setInterval | | ? | server/index.js:142 |
++| OpenVibe.Media | setInterval | | ? | server/pastes/routes.js:703 |
| OpenVibe.Media | setInterval | | ? | server/vod/clip-cutter.js:111 |
| OpenVibe.Media | setInterval | | ? | server/vod/clip-jobs.js:117 |
| OpenVibe.Media | setInterval | | ? | server/vod/health-job.js:262 |
@@@ -130,5 +130,6 @@ Deliverable 4, plus the background-job half of the exit criteria.
| OpenVibe.Tools | setInterval | | ? | apps/yt/server/downloader.js:555 |
| OpenVibe.Tools | setInterval | | 5 s | apps/yt/server/downloader.js:606 |
| OpenVibe.Tools | setInterval | | 0.5 s | apps/yt/server/index.js:196 |
++| OpenVibe.Community | setInterval | | ? | server/pastes/service.js:211 |
| OpenVibe.Games | setInterval | | ? | apps/server/src/main.ts:159 |
| OpenVibe.Games | setInterval | | ? | apps/server/src/net/editorWs.ts:82 |
ddiff --git a/docs/roadmap-baseline/06-secrets.md b/docs/roadmap-baseline/06-secrets.md
iindex 120fc5ef..ae9248e6 100644
---- a/docs/roadmap-baseline/06-secrets.md
++++ b/docs/roadmap-baseline/06-secrets.md
@@@ -22,18 +22,19 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
|---|---|---|---|
| OpenVibe.Community | COOKIE_SECURE | **not set** | server/config.js |
| OpenVibe.Community | OV_OAUTH_CLIENT_SECRET | community.env | server/config.js |
++| OpenVibe.Community | VIEW_HASH_SECRET | **not set** | server/pastes/service.js |
| OpenVibe.Games | EDITOR_KEY | games.env | apps/server/src/config.ts |
| OpenVibe.Games | OV_OAUTH_CLIENT_SECRET | games.env | apps/server/src/config.ts |
| OpenVibe.Live | ADMIN_PASSWORD | live.env | server/config.js |
| OpenVibe.Live | GH_TOKEN | **not set** | server/meta/routes.js |
| OpenVibe.Live | GITHUB_TOKEN | **not set** | server/meta/routes.js |
--| OpenVibe.Live | INTERNAL_API_KEY | live.env | server/chat/chat-server.js, server/config.js, server/monetization/wallet-client.js +2 |
++| OpenVibe.Live | INTERNAL_API_KEY | live.env | server/chat/chat-server.js, server/config.js, server/monetization/wallet-client.js +3 |
| OpenVibe.Live | JWT_SECRET | live.env | server/arena/arena-service.js, server/config.js, server/integrations/platform-oauth.js +1 |
| OpenVibe.Live | MEDIA_API_KEY | live.env | server/media-client.js |
| OpenVibe.Live | MEDIA_WEBHOOK_SECRET | live.env | server/media-proxy/webhook.js |
| OpenVibe.Live | OPS_ALERT_WEBHOOK_URL | **not set** | server/media-proxy/webhook.js |
--| OpenVibe.Live | OV_INTERNAL_KEY | **not set** | server/chat/chat-server.js, server/config.js, server/monetization/wallet-client.js +2 |
--| OpenVibe.Live | OV_OAUTH_CLIENT_SECRET | live.env | server/auth/routes.js |
++| OpenVibe.Live | OV_INTERNAL_KEY | **not set** | server/chat/chat-server.js, server/config.js, server/monetization/wallet-client.js +3 |
++| OpenVibe.Live | OV_OAUTH_CLIENT_SECRET | live.env | server/auth/routes.js, server/net/network-principal.js |
| OpenVibe.Live | PAYPAL_CLIENT_SECRET | live.env | server/config.js |
| OpenVibe.Live | TURN_AUTH_SECRET | live.env | server/auth/routes.js, server/net/turn.js |
| OpenVibe.Live | TURN_CREDENTIAL | live.env | server/config.js |
@@@ -63,11 +64,11 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| File | Variables |
|---|---|
--| /etc/openvibe/community.env | 13 |
++| /etc/openvibe/community.env | 14 |
| /etc/openvibe/games.env | 12 |
| /etc/openvibe/generated-secrets.env | 6 |
--| /etc/openvibe/live.env | 53 |
--| /etc/openvibe/media.env | 26 |
++| /etc/openvibe/live.env | 54 |
++| /etc/openvibe/media.env | 28 |
| /etc/openvibe/network.env | 21 |
| /etc/openvibe/tools.env | 9 |
@@@ -76,6 +77,7 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| Repo | Variable | In prod | Read at |
|---|---|---|---|
| OpenVibe.Community | BASE_URL | community.env | server/config.js |
++| OpenVibe.Community | COMMUNITY_DB_PATH | | server/config.js |
| OpenVibe.Community | HOST | community.env | server/config.js |
| OpenVibe.Community | LOGIN_URL | | vendor/openvibe-shared/brand.js |
| OpenVibe.Community | NODE_ENV | community.env | server/config.js |
@@@ -90,6 +92,7 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.Community | OV_LIVE_URL | community.env | server/config.js, vendor/openvibe-shared/brand.js |
| OpenVibe.Community | OV_LOGO_URL | | vendor/openvibe-shared/brand.js |
| OpenVibe.Community | OV_MAPS_URL | | vendor/openvibe-shared/brand.js |
++| OpenVibe.Community | OV_MEDIA_INTERNAL_URL | | server/config.js |
| OpenVibe.Community | OV_MEDIA_URL | community.env | server/config.js, vendor/openvibe-shared/brand.js |
| OpenVibe.Community | OV_NET_URL | | vendor/openvibe-shared/brand.js |
| OpenVibe.Community | OV_NETWORK_INTERNAL_URL | community.env | server/config.js |
@@@ -101,6 +104,7 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.Community | OV_TEXT_URL | | vendor/openvibe-shared/brand.js |
| OpenVibe.Community | OV_TOOLS_URL | | vendor/openvibe-shared/brand.js |
| OpenVibe.Community | OV_YT_URL | | vendor/openvibe-shared/brand.js |
++| OpenVibe.Community | PASTES_AUTHORITY | community.env | server/config.js |
| OpenVibe.Community | PORT | community.env | server/config.js |
| OpenVibe.Community | TRUST_PROXY | community.env | server/config.js |
| OpenVibe.Games | DB_PATH | games.env | apps/server/src/config.ts |
@@@ -162,7 +166,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.Live | OFFLINE_SCREEN_PATH | | server/monetization/routes.js, server/streaming/routes.js |
| OpenVibe.Live | OV_APP_ROOT | | server/docs/routes.js, server/web/assets.js |
| OpenVibe.Live | OV_AUDIO_URL | | vendor/openvibe-shared/brand.js |
--| OpenVibe.Live | OV_COMMUNITY_URL | live.env | server/index.js, server/seo/seo.js +1 |
++| OpenVibe.Live | OV_COMMUNITY_INTERNAL_URL | | server/pastes-client.js |
++| OpenVibe.Live | OV_COMMUNITY_URL | live.env | server/index.js, server/media-proxy/pastes.js +2 |
| OpenVibe.Live | OV_DEV_URL | | vendor/openvibe-shared/brand.js |
| OpenVibe.Live | OV_DOCS_URL | | vendor/openvibe-shared/brand.js |
| OpenVibe.Live | OV_FOOD_URL | | vendor/openvibe-shared/brand.js |
@@@ -173,17 +178,18 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.Live | OV_MAPS_URL | | vendor/openvibe-shared/brand.js |
| OpenVibe.Live | OV_MEDIA_URL | | vendor/openvibe-shared/brand.js |
| OpenVibe.Live | OV_NET_URL | | vendor/openvibe-shared/brand.js |
--| OpenVibe.Live | OV_NETWORK_INTERNAL_URL | live.env | server/chat/chat-server.js, server/monetization/wallet-client.js +1 |
++| OpenVibe.Live | OV_NETWORK_INTERNAL_URL | live.env | server/chat/chat-server.js, server/monetization/wallet-client.js +3 |
| OpenVibe.Live | OV_NETWORK_LOGIN_URL | | vendor/openvibe-shared/brand.js |
| OpenVibe.Live | OV_NETWORK_PUBLIC_KEY | live.env | server/auth/auth.js |
| OpenVibe.Live | OV_NETWORK_URL | live.env | server/auth/auth.js, server/config.js +2 |
--| OpenVibe.Live | OV_OAUTH_CLIENT_ID | live.env | server/auth/routes.js |
++| OpenVibe.Live | OV_OAUTH_CLIENT_ID | live.env | server/auth/routes.js, server/net/network-principal.js |
| OpenVibe.Live | OV_PASTES_URL | | vendor/openvibe-shared/brand.js |
| OpenVibe.Live | OV_PUBLIC_DIR | | server/web/assets.js |
| OpenVibe.Live | OV_TEXT_URL | | vendor/openvibe-shared/brand.js |
| OpenVibe.Live | OV_TOOLS_URL | | vendor/openvibe-shared/brand.js |
| OpenVibe.Live | OV_YT_URL | | vendor/openvibe-shared/brand.js |
| OpenVibe.Live | OWNER_USERNAME | | server/db/database.js |
++| OpenVibe.Live | PASTES_AUTHORITY | live.env | server/pastes-client.js |
| OpenVibe.Live | PASTES_ON_COMMUNITY | live.env | server/index.js, server/seo/seo.js |
| OpenVibe.Live | PATH | | server/media/media-downloader.js |
| OpenVibe.Live | PAYPAL_CLIENT_ID | live.env | server/config.js |
@@@ -273,6 +279,8 @@ Deliverable 5. Names and locations only; no value was read. "In prod" names the
| OpenVibe.Media | OV_TEXT_URL | | vendor/openvibe-shared/brand.js |
| OpenVibe.Media | OV_TOOLS_URL | | vendor/openvibe-shared/brand.js |
| OpenVibe.Media | OV_YT_URL | | vendor/openvibe-shared/brand.js |
++| OpenVibe.Media | PASTES_FROZEN_APPS | media.env | server/pastes/routes.js |
++| OpenVibe.Media | PASTES_MOVED_TO | media.env | (not referenced) |
| OpenVibe.Media | PASTES_PATH | media.env | server/config.js |
| OpenVibe.Media | PORT | media.env | (not referenced) |
| OpenVibe.Media | RTP_PORT_MAX | media.env | (not referenced) |
ddiff --git a/docs/roadmap-baseline/07-ownership.md b/docs/roadmap-baseline/07-ownership.md
iindex c81cd9e3..bb91b730 100644
---- a/docs/roadmap-baseline/07-ownership.md
++++ b/docs/roadmap-baseline/07-ownership.md
@@@ -9,10 +9,10 @@ Deliverable 6. Current owner = the repo that creates the table; target owner = r
| Current owner | Tables | Stay | Move | Frozen legacy | Investigate |
|---|---|---|---|---|---|
| OpenVibe.Live | 186 | 26 | 94 | 43 | 23 |
--| OpenVibe.Network | 36 | 33 | 3 | 0 | 0 |
++| OpenVibe.Network | 39 | 36 | 3 | 0 | 0 |
| OpenVibe.Media | 15 | 12 | 3 | 0 | 0 |
| OpenVibe.Tools | 4 | 4 | 0 | 0 | 0 |
--| OpenVibe.Community | 4 | 4 | 0 | 0 | 0 |
++| OpenVibe.Community | 13 | 13 | 0 | 0 | 0 |
| OpenVibe.Games | 5 | 5 | 0 | 0 | 0 |
| OpenVibe.Sites | 0 | 0 | 0 | 0 | 0 |
ddiff --git a/docs/roadmap-baseline/08-discrepancies.md b/docs/roadmap-baseline/08-discrepancies.md
iindex 2ac9a0eb..63f06b1f 100644
---- a/docs/roadmap-baseline/08-discrepancies.md
++++ b/docs/roadmap-baseline/08-discrepancies.md
@@@ -2,7 +2,7 @@
> Generated by `scripts/roadmap-baseline/generate.js`. Do not edit by hand; edit `data/*.json` or the extractor and regenerate.
--Deliverable 7. Snapshot of openvibe-oregon taken 2026-09-22 21:23 UTC compared with the local checkouts. `unknown` rows are things this environment cannot see.
++Deliverable 7. Snapshot of openvibe-oregon taken 2026-09-22 23:36 UTC compared with the local checkouts. `unknown` rows are things this environment cannot see.
| Severity | Area | Subject | Detail |
|---|---|---|---|
@@@ -11,6 +11,7 @@ Deliverable 7. Snapshot of openvibe-oregon taken 2026-09-22 21:23 UTC compared w
| low | database | /opt/openvibe.live/data/openvibe.db | 0 B, zero tables (dead file) |
| low | deploy | games | deployed 43c11f0 has the same file tree as origin/main 5710287 but a different SHA (pre-rewrite history); reset the checkout so later pulls fast-forward |
| low | env | OpenVibe.Community:COOKIE_SECURE | secret-named variable read by code but not set in the service env file: verify it is optional or has no hardcoded fallback |
++| low | env | OpenVibe.Community:VIEW_HASH_SECRET | secret-named variable read by code but not set in the service env file: verify it is optional or has no hardcoded fallback |
| low | env | OpenVibe.Live:GH_TOKEN | secret-named variable read by code but not set in the service env file: verify it is optional or has no hardcoded fallback |
| low | env | OpenVibe.Live:GITHUB_TOKEN | secret-named variable read by code but not set in the service env file: verify it is optional or has no hardcoded fallback |
| low | env | OpenVibe.Live:OPS_ALERT_WEBHOOK_URL | secret-named variable read by code but not set in the service env file: verify it is optional or has no hardcoded fallback |
@@@ -94,6 +95,7 @@ Deliverable 7. Snapshot of openvibe-oregon taken 2026-09-22 21:23 UTC compared w
| info | env | OpenVibe.Live:RS_COMPANION_DB_PATH | set in live.env but not referenced by scanned code (may be read by a dependency or stale) |
| info | env | OpenVibe.Live:RS_PASSTHROUGH_ROBOTS | set in live.env but not referenced by scanned code (may be read by a dependency or stale) |
| info | env | OpenVibe.Live:UNSAFE_WORDS_PATH | set in live.env but not referenced by scanned code (may be read by a dependency or stale) |
++| info | env | OpenVibe.Media:PASTES_MOVED_TO | set in media.env but not referenced by scanned code (may be read by a dependency or stale) |
| info | env | OpenVibe.Media:PORT | set in media.env but not referenced by scanned code (may be read by a dependency or stale) |
| info | env | OpenVibe.Media:RTP_PORT_MAX | set in media.env but not referenced by scanned code (may be read by a dependency or stale) |
| info | env | OpenVibe.Media:RTP_PORT_MIN | set in media.env but not referenced by scanned code (may be read by a dependency or stale) |
@@@ -102,6 +104,10 @@ Deliverable 7. Snapshot of openvibe-oregon taken 2026-09-22 21:23 UTC compared w
| info | env | OpenVibe.Network:NOTIFICATIONS_ENABLED | set in network.env but not referenced by scanned code (may be read by a dependency or stale) |
| info | env | OpenVibe.Tools:MEDIA_PUBLIC_URL | set in tools.env but not referenced by scanned code (may be read by a dependency or stale) |
| info | env | OpenVibe.Tools:MEDIA_URL | set in tools.env but not referenced by scanned code (may be read by a dependency or stale) |
++| info | schema | OpenVibe.Community:analytics_daily | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
++| info | schema | OpenVibe.Community:analytics_events | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
++| info | schema | OpenVibe.Community:analytics_hourly | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
++| info | schema | OpenVibe.Community:analytics_rate_tracking | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
| info | schema | OpenVibe.Live:channel_sounds_new | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
| info | schema | OpenVibe.Live:chat_messages_new | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
| info | schema | OpenVibe.Live:emotes_new | declared in code but absent from every production database for this service (lazy/unused/legacy migration) |
ddiff --git a/docs/roadmap-baseline/09-d-status.md b/docs/roadmap-baseline/09-d-status.md
iindex 0b9e1e4d..f489c3cd 100644
---- a/docs/roadmap-baseline/09-d-status.md
++++ b/docs/roadmap-baseline/09-d-status.md
@@@ -10,24 +10,24 @@ Deliverable 8. Family-level status from roadmap 3.2. Evidence paths are checked
| D02-D04 | Registry, capabilities, contracts | absent | missing | W1, W2 | Network/server/url-registry.js; Sites/sites.json | 20 charter-only repos of 32; Live 15, Network 0, Media 0, Tools 0, Community 0, Games 0, Sites 0 |
| D05-D06 | Policy, staff, user modules | partial | partial | W1, W2 | Network/server/admin; Live/server/auth/permissions.js | - |
| D07-D10 | Themes, notifications, social, analytics | partial | partial | W1, W2, Track O | Network/server/themes; Network/server/notifications | 5 repos carry their own analytics_events |
--| D11-D13 | Events, realtime, SDK | absent | missing | W2, W3 | Media/server/webhooks.js | 65 caller-file/target pairs across 50 files; 10 WebSocket server constructions |
++| D11-D13 | Events, realtime, SDK | absent | missing | W2, W3 | Media/server/webhooks.js | 68 caller-file/target pairs across 52 files; 10 WebSocket server constructions |
| D14-D16 | Media | partial | partial | W4 | Media/server/vod; Media/server/pastes | 3 Media tables target OpenVibe.Community |
| D17-D20 | Live, OpenRe, channel/VOD lineage | partial | partial | W7 | Live/server/streaming/rtmp-server.js; Live/server/streaming/restream-manager.js | 14 Live tables target OpenRe.Stream |
| D21-D23 | Chat | partial | partial | W6 | Live/server/chat/chat-server.js; Live/server/streaming/call-server.js | 23 Live tables target OpenVibe.Chat |
--| D24-D27 | Community | partial | partial | W5 | Community/server/pastes | 4 tables; 4 Live tables target OpenVibe.Community |
++| D24-D27 | Community | partial | partial | W5 | Community/server/pastes | 13 tables; 4 Live tables target OpenVibe.Community |
| D28-D30 | Billing, Tips, VIP | partial | partial | W8-W10 (ADR-012 first) | Live/server/monetization/payments.js; Network/server/coins | 2 Live tables target OpenVibe.Billing; 2 Network tables target OpenVibe.Billing (loyalty ledger) |
| D31 | Tools | built | already-present-and-verified | W11 | Tools/apps/gateway | 2 test files |
| D32 | Games | built | already-present-and-verified | W12 | Games/apps/server/src/net/sso.ts | 56 test files |
| D33-D34 | Codes, Host | absent | missing | W20, W21 | - | 20 charter-only repos of 32 |
| D35-D38 | AI, content, sources, search | partial | partial | W13-W15 | Live/server/ai/moment-registry.js; Live/server/ai/llm.js | 14 Live tables target OpenVibe.AI |
| D39 | Mods | absent | missing | W12, W21 | - | - |
--| D40 | Open developer services | absent | missing | W20, W21 | Live/server/integrations/powerchat-routes.js | 28 of 65 call sites authenticate with the shared internal key |
++| D40 | Open developer services | absent | missing | W20, W21 | Live/server/integrations/powerchat-routes.js | 28 of 68 call sites authenticate with the shared internal key |
| D41 | Independent runtime lifecycle | partial | partial | W7, W21 | Live/deploy | hazard H1; hazard H3 |
| D42 | Shared component architecture | partial | partial | W2, Track R | Network/packages/openvibe-shared | 5 repos vendor openvibe-shared (129 files); 4 divergent: Community/ov-icons.js, Live/user-card.js, Media/ov-icons.js, Tools/ov-icons.js |
| D43 | Safe active-client updates | absent | missing | Track R | Live/server/chat/deploy-notice.js; Live/server/web/assets.js | - |
| D44 | Crawlable component rendering | built | already-present-and-verified | Track R (preserve) | Community/server/seo.js; Sites/build.js | - |
| D45 | Release compatibility and recovery | absent | missing | Track R, W22 | - | 1 service(s) not running origin/main |
--| D46 | Update observability and acceptance | absent | missing | Track R, Track O | - | 0 of 7 scanned repos have .github/workflows |
++| D46 | Update observability and acceptance | absent | missing | Track R, Track O | - | 4 of 7 scanned repos have .github/workflows |
Totals: 3 built, 11 partial, 8 absent across 22 families; 22 verified.
ddiff --git a/docs/roadmap-baseline/10-hazards.md b/docs/roadmap-baseline/10-hazards.md
iindex f209c6a8..fd1afde9 100644
---- a/docs/roadmap-baseline/10-hazards.md
++++ b/docs/roadmap-baseline/10-hazards.md
@@@ -12,7 +12,7 @@ Deliverable 9. **Not yet reviewed by the production-host owner** (Wave 0 exit cr
| H4 | managed_streams.stream_key values still need rotation after a past leak | high | open | Live maintainers (security track S) | W7 (openre.key.rotate) - or earlier as a standalone rotation | Ship per-stream key regeneration and rotate every key; notify affected streamers. | - |
| H5 | Multilingual Whisper model missing breaks non-English captions | medium | mitigated | Live maintainers | - | Install the model and set WHISPER_MODEL_MULTI in live.env. | WHISPER_MODEL_MULTI is set in live.env |
| H6 | YouTube refuses the server IP; the yt tool needs a proxy | low | open | Platform operator | W11 | Set YT_PROXY and/or YT_COOKIES_FILE for openvibe-tools-yt. | YT_PROXY still unset in tools.env |
--| H7 | Workstation root disk near full; headless Chrome can hit ENOSPC | low | open | Workstation owner | Track Q | Browser harness must support a remote/containerised runner; prune ~/.claude transcripts (~1.2 GB). | workstation / is 82% used (at generation time) |
++| H7 | Workstation root disk near full; headless Chrome can hit ENOSPC | low | open | Workstation owner | Track Q | Browser harness must support a remote/containerised runner; prune ~/.claude transcripts (~1.2 GB). | workstation / is 83% used (at generation time) |
| H8 | A hardcoded internal secret was previously public | high | open | Platform operator (security track S) | W1 (scoped service principals) / Track S | Rotate INTERNAL_API_KEY per service and the Cloudflare token; move to scoped service tokens. | - |
| H9 | Removed features and copy rules must not be undone | medium | standing-rule | Every product wave | all | Product waves check the prohibitions list (roadmap 9.1) before adding copy or campaigns. | - |
| H10 | Commit identity | medium | open | Every contributor | all | Per-repo git config user.email = [email protected]; review history before push. | main history violates the rule in: Live (238 commits with assistant trailers); Network (14 commits with assistant trailers); Media (30 commits with assistant trailers); Tools (9 commits with assistant trailers) |
ddiff --git a/docs/roadmap-baseline/README.md b/docs/roadmap-baseline/README.md
iindex b0936fa3..7238ade8 100644
---- a/docs/roadmap-baseline/README.md
++++ b/docs/roadmap-baseline/README.md
@@@ -2,19 +2,19 @@
The audit baseline from the OpenVibe development roadmap (Wave 0; section 12 items 1-3): what exists across the estate, who owns each piece of data today and who should, what production looks like next to the repos, and which hazards constrain later waves. Every file here except `data/*.json` is generated.
--Source commits: Live `24151bd`, Network `9b4e262`, Media `6114bc6`, Tools `0346edc`, Community `de947ea`, Games `5710287`, Sites `185014f`. Production snapshot: openvibe-oregon, 2026-09-22.
++Source commits: Live `e266060`, Network `1b79576`, Media `ddfefcf`, Tools `0346edc`, Community `d7c6e60`, Games `5710287`, Sites `185014f`. Production snapshot: openvibe-oregon, 2026-09-22.
## Deliverables
| # | Artifact | Contents |
|---|---|---|
| 1 | [01-services.md](01-services.md) | services, ports, units, env files, repo state, GitHub census |
--| 2 | [02-schema.md](02-schema.md) | 250 tables with current/target owner |
--| 3 | [03-routes.md](03-routes.md), [04-cross-service.md](04-cross-service.md) | 928 routes; 65 cross-service call sites |
++| 2 | [02-schema.md](02-schema.md) | 262 tables with current/target owner |
++| 3 | [03-routes.md](03-routes.md), [04-cross-service.md](04-cross-service.md) | 968 routes; 68 cross-service call sites |
| 4 | [05-realtime-and-jobs.md](05-realtime-and-jobs.md) | WebSocket servers and paths, non-HTTP protocols, background jobs |
| 5 | [06-secrets.md](06-secrets.md) | auth mechanisms and secret names (no values) |
| 6 | [07-ownership.md](07-ownership.md) | current vs target data ownership |
--| 7 | [08-discrepancies.md](08-discrepancies.md) | 108 production-vs-repo items |
++| 7 | [08-discrepancies.md](08-discrepancies.md) | 114 production-vs-repo items |
| 8 | [09-d-status.md](09-d-status.md) | D01-D46 family status from evidence |
| 9 | [10-hazards.md](10-hazards.md) | 14 hazards with owners, mitigations and waves |
| - | [inventory.json](inventory.json) | everything above, machine-readable |
@@@ -23,10 +23,10 @@ Source commits: Live `24151bd`, Network `9b4e262`, Media `6114bc6`, Tools `0346e
| | Criterion | Result |
|---|---|---|
--| pass | Every table has an owner classification | 250 tables classified, 0 unclassified |
--| pass | Every route is attributed to a repo and source line | 928 routes; 0 router mounts whose module could not be resolved (their routes are listed without the mount prefix) |
--| pass | Every background job is listed with its location | 82 timers/jobs |
--| pass | Every cross-service call records caller, callee, auth, timeout and retry | 65 call sites; 30 with no timeout detected |
++| pass | Every table has an owner classification | 262 tables classified, 0 unclassified |
++| pass | Every route is attributed to a repo and source line | 968 routes; 0 router mounts whose module could not be resolved (their routes are listed without the mount prefix) |
++| pass | Every background job is listed with its location | 83 timers/jobs |
++| pass | Every cross-service call records caller, callee, auth, timeout and retry | 68 call sites; 30 with no timeout detected |
| pass | Unknowns are marked unknown, not guessed | 2 unknown items recorded |
| pass | D01-D46 status resolved from evidence | 22/22 families verified |
| **open** | Hazard register reviewed by the production-host owner | pending: set reviewedBy in data/hazards.json after review |
ddiff --git a/docs/roadmap-baseline/inventory.json b/docs/roadmap-baseline/inventory.json
iindex 81a42a05..512c50de 100644
---- a/docs/roadmap-baseline/inventory.json
++++ b/docs/roadmap-baseline/inventory.json
@@@ -1,16 +1,16 @@
{
"generatedFrom": {
-- "OpenVibe.Live": "24151bdc12ffe6e6f2fbe8c3770327b2d1635a8a",
-- "OpenVibe.Network": "9b4e262cd8daf05ee2b6b92a06dabe70e2d42bc7",
-- "OpenVibe.Media": "6114bc61c466cd51335548d0ce87058df125c577",
++ "OpenVibe.Live": "e26606082958f8cf6bb7c4587c225ca09335b5fe",
++ "OpenVibe.Network": "1b79576cb024714e56ae2ccc7728080d3d3e0118",
++ "OpenVibe.Media": "ddfefcf47740715f24fe7aa7dea648b4699162fc",
"OpenVibe.Tools": "0346edc57fb9f588abcdea171a22a5ca33f772d2",
-- "OpenVibe.Community": "de947ead2addce29d7f9b98f3d894075ca4e82f2",
++ "OpenVibe.Community": "d7c6e608d8e27e6ddbfc78a15fa7590036b1dded",
"OpenVibe.Games": "571028796639c00d5deecca038634ef1c52d3480",
"OpenVibe.Sites": "185014ff01ed8bd8f6df3dd5099e2b6c904e235d"
},
"prodSnapshot": {
"host": "openvibe-oregon",
-- "collectedAt": "2026-09-22T21:23:31.121Z"
++ "collectedAt": "2026-09-22T23:36:01.667Z"
},
"repos": [
{
@@@ -18,13 +18,13 @@
"service": "live",
"present": true,
"git": {
-- "head": "24151bdc12ffe6e6f2fbe8c3770327b2d1635a8a",
++ "head": "e26606082958f8cf6bb7c4587c225ca09335b5fe",
"branch": "main",
-- "originMain": "24151bdc12ffe6e6f2fbe8c3770327b2d1635a8a",
-- "committedAt": "2026-09-22T14:18:25-07:00"
++ "originMain": "e26606082958f8cf6bb7c4587c225ca09335b5fe",
++ "committedAt": "2026-09-22T16:28:23-07:00"
},
-- "sourceFiles": 165,
-- "loc": 69699,
++ "sourceFiles": 167,
++ "loc": 69978,
"tables": [
{
"table": "arena_profiles",
@@@ -2920,6 +2920,12 @@
"file": "server/media-proxy/pastes.js",
"line": 222
},
++ {
++ "method": "POST",
++ "path": "/api/pastes/:slug/censor",
++ "file": "server/media-proxy/pastes.js",
++ "line": 315
++ },
{
"method": "GET",
"path": "/api/pastes/:slug/comments",
@@@ -2962,18 +2968,36 @@
"file": "server/media-proxy/pastes.js",
"line": 240
},
++ {
++ "method": "GET",
++ "path": "/api/pastes/:slug/raw",
++ "file": "server/media-proxy/pastes.js",
++ "line": 311
++ },
{
"method": "POST",
"path": "/api/pastes/:slug/set-avatar",
"file": "server/media-proxy/pastes.js",
"line": 110
},
++ {
++ "method": "POST",
++ "path": "/api/pastes/:slug/set-avatar",
++ "file": "server/media-proxy/pastes.js",
++ "line": 296
++ },
{
"method": "DELETE",
"path": "/api/pastes/admin/forks",
"file": "server/media-proxy/pastes.js",
"line": 171
},
++ {
++ "method": "DELETE",
++ "path": "/api/pastes/admin/forks",
++ "file": "server/media-proxy/pastes.js",
++ "line": 313
++ },
{
"method": "GET",
"path": "/api/pastes/admin/stats",
@@@ -2986,6 +3010,12 @@
"file": "server/media-proxy/pastes.js",
"line": 172
},
++ {
++ "method": "POST",
++ "path": "/api/pastes/bulk",
++ "file": "server/media-proxy/pastes.js",
++ "line": 314
++ },
{
"method": "GET",
"path": "/api/pastes/by-user/:username",
@@@ -4276,10 +4306,12 @@
"server/auth/auth.js"
],
"OV_OAUTH_CLIENT_ID": [
-- "server/auth/routes.js"
++ "server/auth/routes.js",
++ "server/net/network-principal.js"
],
"OV_OAUTH_CLIENT_SECRET": [
-- "server/auth/routes.js"
++ "server/auth/routes.js",
++ "server/net/network-principal.js"
],
"BASE_URL": [
"server/auth/routes.js",
@@@ -4295,12 +4327,15 @@
"OV_NETWORK_INTERNAL_URL": [
"server/chat/chat-server.js",
"server/monetization/wallet-client.js",
++ "server/net/network-principal.js",
++ "server/pastes-client.js",
"server/utils/notify.js"
],
"INTERNAL_API_KEY": [
"server/chat/chat-server.js",
"server/config.js",
"server/monetization/wallet-client.js",
++ "server/net/network-principal.js",
"server/streaming/routes.js",
"server/utils/notify.js"
],
@@@ -4308,6 +4343,7 @@
"server/chat/chat-server.js",
"server/config.js",
"server/monetization/wallet-client.js",
++ "server/net/network-principal.js",
"server/streaming/routes.js",
"server/utils/notify.js"
],
@@@ -4482,6 +4518,7 @@
],
"OV_COMMUNITY_URL": [
"server/index.js",
++ "server/media-proxy/pastes.js",
"server/seo/seo.js",
"vendor/openvibe-shared/brand.js"
],
@@@ -4544,6 +4581,12 @@
"server/monetization/routes.js",
"server/streaming/routes.js"
],
++ "OV_COMMUNITY_INTERNAL_URL": [
++ "server/pastes-client.js"
++ ],
++ "PASTES_AUTHORITY": [
++ "server/pastes-client.js"
++ ],
"OV_PUBLIC_DIR": [
"server/web/assets.js"
],
@@@ -4764,6 +4807,25 @@
"timeout": true,
"retry": false
},
++ {
++ "file": "server/media-proxy/pastes.js",
++ "targets": [
++ {
++ "service": "community",
++ "refs": [
++ {
++ "via": "OV_COMMUNITY_URL",
++ "line": 311
++ }
++ ]
++ }
++ ],
++ "auth": [
++ "none-detected"
++ ],
++ "timeout": true,
++ "retry": true
++ },
{
"file": "server/media-proxy/webhook.js",
"targets": [
@@@ -4803,27 +4865,27 @@
},
{
"via": "OV_NETWORK_INTERNAL_URL",
-- "line": 18
++ "line": 19
},
{
"via": ":4000",
-- "line": 18
++ "line": 19
},
{
"via": "/internal/coins",
-- "line": 71
++ "line": 79
},
{
"via": "/internal/coins",
-- "line": 84
++ "line": 92
},
{
"via": "/internal/coins",
-- "line": 95
++ "line": 103
},
{
"via": "/internal/coins",
-- "line": 143
++ "line": 151
}
]
}
@@@ -4833,7 +4895,39 @@
"bearer"
],
"timeout": true,
-- "retry": false
++ "retry": true
++ },
++ {
++ "file": "server/pastes-client.js",
++ "targets": [
++ {
++ "service": "community",
++ "refs": [
++ {
++ "via": "OV_COMMUNITY_INTERNAL_URL",
++ "line": 16
++ }
++ ]
++ },
++ {
++ "service": "network",
++ "refs": [
++ {
++ "via": "OV_NETWORK_INTERNAL_URL",
++ "line": 39
++ },
++ {
++ "via": ":4000",
++ "line": 39
++ }
++ ]
++ }
++ ],
++ "auth": [
++ "none-detected"
++ ],
++ "timeout": true,
++ "retry": true
},
{
"file": "server/seo/seo.js",
@@@ -4909,15 +5003,15 @@
},
{
"via": "/internal/notifications",
-- "line": 60
++ "line": 66
},
{
"via": "/internal/notifications",
-- "line": 114
++ "line": 120
},
{
"via": "/internal/notifications",
-- "line": 137
++ "line": 143
}
]
}
@@@ -4926,7 +5020,7 @@
"internal-key"
],
"timeout": false,
-- "retry": false
++ "retry": true
},
{
"file": "vendor/openvibe-shared/account-switcher.js",
@@@ -5366,21 +5460,21 @@
],
"contractTodos": 15,
"unresolvedMounts": [],
-- "testFiles": 56,
-- "ci": false
++ "testFiles": 58,
++ "ci": true
},
{
"name": "OpenVibe.Network",
"service": "network",
"present": true,
"git": {
-- "head": "9b4e262cd8daf05ee2b6b92a06dabe70e2d42bc7",
++ "head": "1b79576cb024714e56ae2ccc7728080d3d3e0118",
"branch": "main",
-- "originMain": "9b4e262cd8daf05ee2b6b92a06dabe70e2d42bc7",
-- "committedAt": "2026-09-22T14:14:53-07:00"
++ "originMain": "1b79576cb024714e56ae2ccc7728080d3d3e0118",
++ "committedAt": "2026-09-22T16:11:37-07:00"
},
-- "sourceFiles": 79,
-- "loc": 20646,
++ "sourceFiles": 81,
++ "loc": 21029,
"tables": [
{
"table": "admin_rate_limits",
@@@ -5562,6 +5656,24 @@
"line": 26,
"via": "repo"
},
++ {
++ "table": "user_modules",
++ "file": "server/identity/modules.js",
++ "line": 24,
++ "via": "repo"
++ },
++ {
++ "table": "principal_grants",
++ "file": "server/identity/principals.js",
++ "line": 44,
++ "via": "repo"
++ },
++ {
++ "table": "principal_usage",
++ "file": "server/identity/principals.js",
++ "line": 54,
++ "via": "repo"
++ },
{
"table": "identity_legacy_map",
"file": "server/identity/subjects.js",
@@@ -5571,7 +5683,7 @@
{
"table": "stream_live_announcements",
"file": "server/internal/routes.js",
-- "line": 310,
++ "line": 325,
"via": "repo"
},
{
@@@ -5646,7 +5758,7 @@
"method": "GET",
"path": "/.well-known/web-identity",
"file": "server/index.js",
-- "line": 572
++ "line": 574
},
{
"method": "POST",
@@@ -5706,7 +5818,7 @@
"method": "GET",
"path": "/api/admin/ssh-info",
"file": "server/index.js",
-- "line": 452
++ "line": 454
},
{
"method": "GET",
@@@ -5892,7 +6004,7 @@
"method": "GET",
"path": "/api/catalog.json",
"file": "server/index.js",
-- "line": 423
++ "line": 425
},
{
"method": "GET",
@@@ -5984,6 +6096,48 @@
"file": "server/history/routes.js",
"line": 137
},
++ {
++ "method": "GET",
++ "path": "/api/modules",
++ "file": "server/identity/modules.js",
++ "line": 101
++ },
++ {
++ "method": "DELETE",
++ "path": "/api/modules/:ns",
++ "file": "server/identity/modules.js",
++ "line": 126
++ },
++ {
++ "method": "GET",
++ "path": "/api/modules/:ns",
++ "file": "server/identity/modules.js",
++ "line": 109
++ },
++ {
++ "method": "PUT",
++ "path": "/api/modules/:ns",
++ "file": "server/identity/modules.js",
++ "line": 117
++ },
++ {
++ "method": "GET",
++ "path": "/api/modules/:ns/public/:subject",
++ "file": "server/identity/modules.js",
++ "line": 93
++ },
++ {
++ "method": "GET",
++ "path": "/api/modules/modules/:ns/:subject",
++ "file": "server/identity/modules.js",
++ "line": 140
++ },
++ {
++ "method": "PUT",
++ "path": "/api/modules/modules/:ns/:subject",
++ "file": "server/identity/modules.js",
++ "line": 149
++ },
{
"method": "DELETE",
"path": "/api/profile/avatar",
@@@ -6036,7 +6190,7 @@
"method": "GET",
"path": "/api/sso/targets",
"file": "server/index.js",
-- "line": 405
++ "line": 407
},
{
"method": "GET",
@@@ -6252,55 +6406,55 @@
"method": "GET",
"path": "/internal/anon-admin",
"file": "server/internal/routes.js",
-- "line": 628
++ "line": 643
},
{
"method": "GET",
"path": "/internal/anon-list",
"file": "server/internal/routes.js",
-- "line": 677
++ "line": 692
},
{
"method": "POST",
"path": "/internal/audit",
"file": "server/internal/routes.js",
-- "line": 166
++ "line": 178
},
{
"method": "POST",
"path": "/internal/coins/credit",
"file": "server/internal/routes.js",
-- "line": 252
++ "line": 267
},
{
"method": "POST",
"path": "/internal/coins/debit",
"file": "server/internal/routes.js",
-- "line": 264
++ "line": 279
},
{
"method": "GET",
"path": "/internal/coins/stats",
"file": "server/internal/routes.js",
-- "line": 214
++ "line": 226
},
{
"method": "POST",
"path": "/internal/coins/transfer",
"file": "server/internal/routes.js",
-- "line": 277
++ "line": 292
},
{
"method": "POST",
"path": "/internal/events/stream-live",
"file": "server/internal/routes.js",
-- "line": 294
++ "line": 309
},
{
"method": "POST",
"path": "/internal/identity/legacy-map",
"file": "server/identity/internal-routes.js",
-- "line": 29
++ "line": 52
},
{
"method": "GET",
@@@ -6308,113 +6462,131 @@
"file": "server/identity/internal-routes.js",
"line": 18
},
++ {
++ "method": "GET",
++ "path": "/internal/identity/resolve",
++ "file": "server/internal/routes.js",
++ "line": 40
++ },
++ {
++ "method": "POST",
++ "path": "/internal/identity/resolve-batch",
++ "file": "server/identity/internal-routes.js",
++ "line": 35
++ },
++ {
++ "method": "POST",
++ "path": "/internal/identity/resolve-batch",
++ "file": "server/internal/routes.js",
++ "line": 41
++ },
{
"method": "POST",
"path": "/internal/issue-token",
"file": "server/internal/routes.js",
-- "line": 518
++ "line": 533
},
{
"method": "POST",
"path": "/internal/link-account",
"file": "server/internal/routes.js",
-- "line": 108
++ "line": 120
},
{
"method": "POST",
"path": "/internal/notifications/mark-read",
"file": "server/internal/routes.js",
-- "line": 479
++ "line": 494
},
{
"method": "POST",
"path": "/internal/notifications/push",
"file": "server/internal/routes.js",
-- "line": 421
++ "line": 436
},
{
"method": "POST",
"path": "/internal/notifications/push-bulk",
"file": "server/internal/routes.js",
-- "line": 441
++ "line": 456
},
{
"method": "POST",
"path": "/internal/notifications/resolve-users",
"file": "server/internal/routes.js",
-- "line": 498
++ "line": 513
},
{
"method": "GET",
"path": "/internal/notifications/unread/:userId",
"file": "server/internal/routes.js",
-- "line": 464
++ "line": 479
},
{
"method": "POST",
"path": "/internal/resolve-anon",
"file": "server/internal/routes.js",
-- "line": 549
++ "line": 564
},
{
"method": "GET",
"path": "/internal/stats",
"file": "server/internal/routes.js",
-- "line": 175
++ "line": 187
},
{
"method": "GET",
"path": "/internal/url-registry/resolved",
"file": "server/internal/routes.js",
-- "line": 184
++ "line": 196
},
{
"method": "POST",
"path": "/internal/user-avatar",
"file": "server/internal/routes.js",
-- "line": 151
++ "line": 163
},
{
"method": "GET",
"path": "/internal/users/:id",
"file": "server/internal/routes.js",
-- "line": 59
++ "line": 71
},
{
"method": "GET",
"path": "/internal/users/:id/linked-accounts",
"file": "server/internal/routes.js",
-- "line": 159
++ "line": 171
},
{
"method": "GET",
"path": "/internal/users/:id/theme",
"file": "server/internal/routes.js",
-- "line": 96
++ "line": 108
},
{
"method": "POST",
"path": "/internal/users/bulk",
"file": "server/internal/routes.js",
-- "line": 81
++ "line": 93
},
{
"method": "GET",
"path": "/internal/users/by-username/:username",
"file": "server/internal/routes.js",
-- "line": 70
++ "line": 82
},
{
"method": "POST",
"path": "/internal/verify-token",
"file": "server/internal/routes.js",
-- "line": 37
++ "line": 49
},
{
"method": "GET",
"path": "/llms.txt",
"file": "server/index.js",
-- "line": 550
++ "line": 552
},
{
"method": "GET",
@@@ -6480,31 +6652,31 @@
"method": "GET",
"path": "/oauth/.well-known/openid-configuration",
"file": "server/auth/oauth-routes.js",
-- "line": 306
++ "line": 318
},
{
"method": "GET",
"path": "/oauth/authorize",
"file": "server/auth/oauth-routes.js",
-- "line": 21
++ "line": 22
},
{
"method": "POST",
"path": "/oauth/confirm",
"file": "server/auth/oauth-routes.js",
-- "line": 79
++ "line": 80
},
{
"method": "POST",
"path": "/oauth/token",
"file": "server/auth/oauth-routes.js",
-- "line": 132
++ "line": 133
},
{
"method": "GET",
"path": "/openvibe-sw.js",
"file": "server/index.js",
-- "line": 596
++ "line": 598
},
{
"method": "GET",
@@@ -6588,7 +6760,7 @@
"method": "GET",
"path": "/sso/check",
"file": "server/index.js",
-- "line": 577
++ "line": 579
},
{
"method": "GET",
@@@ -6612,7 +6784,7 @@
"method": "GET",
"path": "/tos",
"file": "server/index.js",
-- "line": 419
++ "line": 421
},
{
"method": "GET",
@@@ -6726,7 +6898,7 @@
"method": "GET",
"path": "/verify-email",
"file": "server/index.js",
-- "line": 562
++ "line": 564
}
],
"ws": {
@@@ -7079,7 +7251,7 @@
},
{
"via": "live.internalUrl",
-- "line": 477
++ "line": 479
}
]
},
@@@ -7193,21 +7365,21 @@
"kind": "setInterval",
"name": null,
"intervalMs": 3600000,
-- "line": 652,
++ "line": 654,
"file": "server/index.js"
},
{
"kind": "setInterval",
"name": null,
"intervalMs": 120000,
-- "line": 655,
++ "line": 657,
"file": "server/index.js"
},
{
"kind": "setInterval",
"name": null,
"intervalMs": null,
-- "line": 658,
++ "line": 660,
"file": "server/index.js"
},
{
@@@ -7248,21 +7420,21 @@
],
"contractTodos": 0,
"unresolvedMounts": [],
-- "testFiles": 18,
-- "ci": false
++ "testFiles": 20,
++ "ci": true
},
{
"name": "OpenVibe.Media",
"service": "media",
"present": true,
"git": {
-- "head": "6114bc61c466cd51335548d0ce87058df125c577",
++ "head": "ddfefcf47740715f24fe7aa7dea648b4699162fc",
"branch": "main",
-- "originMain": "6114bc61c466cd51335548d0ce87058df125c577",
-- "committedAt": "2026-09-21T09:58:34-07:00"
++ "originMain": "ddfefcf47740715f24fe7aa7dea648b4699162fc",
++ "committedAt": "2026-09-22T16:14:04-07:00"
},
"sourceFiles": 28,
-- "loc": 8702,
++ "loc": 8752,
"tables": [
{
"table": "apps",
@@@ -7492,121 +7664,121 @@
"method": "GET",
"path": "/api/v1/:app/pastes",
"file": "server/pastes/routes.js",
-- "line": 248
++ "line": 257
},
{
"method": "POST",
"path": "/api/v1/:app/pastes",
"file": "server/pastes/routes.js",
-- "line": 462
++ "line": 471
},
{
"method": "DELETE",
"path": "/api/v1/:app/pastes/:slug",
"file": "server/pastes/routes.js",
-- "line": 616
++ "line": 625
},
{
"method": "GET",
"path": "/api/v1/:app/pastes/:slug",
"file": "server/pastes/routes.js",
-- "line": 436
++ "line": 445
},
{
"method": "PUT",
"path": "/api/v1/:app/pastes/:slug",
"file": "server/pastes/routes.js",
-- "line": 578
++ "line": 587
},
{
"method": "POST",
"path": "/api/v1/:app/pastes/:slug/ai",
"file": "server/pastes/routes.js",
-- "line": 558
++ "line": 567
},
{
"method": "POST",
"path": "/api/v1/:app/pastes/:slug/censor",
"file": "server/pastes/routes.js",
-- "line": 397
++ "line": 406
},
{
"method": "GET",
"path": "/api/v1/:app/pastes/:slug/comments",
"file": "server/pastes/routes.js",
-- "line": 702
++ "line": 711
},
{
"method": "POST",
"path": "/api/v1/:app/pastes/:slug/comments",
"file": "server/pastes/routes.js",
-- "line": 725
++ "line": 734
},
{
"method": "DELETE",
"path": "/api/v1/:app/pastes/:slug/comments/:commentId",
"file": "server/pastes/routes.js",
-- "line": 803
++ "line": 812
},
{
"method": "POST",
"path": "/api/v1/:app/pastes/:slug/copy",
"file": "server/pastes/routes.js",
-- "line": 677
++ "line": 686
},
{
"method": "POST",
"path": "/api/v1/:app/pastes/:slug/fork",
"file": "server/pastes/routes.js",
-- "line": 634
++ "line": 643
},
{
"method": "POST",
"path": "/api/v1/:app/pastes/:slug/like",
"file": "server/pastes/routes.js",
-- "line": 660
++ "line": 669
},
{
"method": "DELETE",
"path": "/api/v1/:app/pastes/admin/forks",
"file": "server/pastes/routes.js",
-- "line": 359
++ "line": 368
},
{
"method": "GET",
"path": "/api/v1/:app/pastes/admin/forks",
"file": "server/pastes/routes.js",
-- "line": 339
++ "line": 348
},
{
"method": "GET",
"path": "/api/v1/:app/pastes/admin/stats",
"file": "server/pastes/routes.js",
-- "line": 329
++ "line": 338
},
{
"method": "POST",
"path": "/api/v1/:app/pastes/bulk",
"file": "server/pastes/routes.js",
-- "line": 372
++ "line": 381
},
{
"method": "GET",
"path": "/api/v1/:app/pastes/config",
"file": "server/pastes/routes.js",
-- "line": 307
++ "line": 316
},
{
"method": "GET",
"path": "/api/v1/:app/stats",
"file": "server/index.js",
-- "line": 93
++ "line": 94
},
{
"method": "GET",
"path": "/api/v1/:app/stats/series/:metric",
"file": "server/index.js",
-- "line": 103
++ "line": 104
},
{
"method": "POST",
@@@ -7738,25 +7910,25 @@
"method": "GET",
"path": "/healthz",
"file": "server/index.js",
-- "line": 82
++ "line": 83
},
{
"method": "POST",
"path": "/internal/avatar-ingest",
"file": "server/index.js",
-- "line": 56
++ "line": 57
},
{
"method": "GET",
"path": "/manifest.webmanifest",
"file": "server/index.js",
-- "line": 44
++ "line": 45
},
{
"method": "GET",
"path": "/tos",
"file": "server/index.js",
-- "line": 41
++ "line": 42
}
],
"ws": {
@@@ -7820,6 +7992,9 @@
"OV_OAUTH_REDIRECT_URI": [
"server/index.js"
],
++ "PASTES_FROZEN_APPS": [
++ "server/pastes/routes.js"
++ ],
"APP_INTERNAL_URLS": [
"server/thumbnails/live-frame-service.js"
],
@@@ -7947,15 +8122,19 @@
"refs": [
{
"via": "network.url",
-- "line": 28
++ "line": 29
},
{
"via": "/api/.well-known/jwks",
-- "line": 28
++ "line": 29
++ },
++ {
++ "via": "network.url",
++ "line": 84
},
{
"via": "network.url",
-- "line": 83
++ "line": 99
}
]
},
@@@ -7964,7 +8143,7 @@
"refs": [
{
"via": "webhook_url (per-app, configured in DB)",
-- "line": 268
++ "line": 305
}
]
}
@@@ -8187,28 +8366,28 @@
"kind": "setInterval",
"name": null,
"intervalMs": null,
-- "line": 58,
++ "line": 59,
"file": "server/auth.js"
},
{
"kind": "setInterval",
"name": null,
"intervalMs": 43200000,
-- "line": 115,
++ "line": 116,
"file": "server/index.js"
},
{
"kind": "setInterval",
"name": null,
"intervalMs": null,
-- "line": 141,
++ "line": 142,
"file": "server/index.js"
},
{
"kind": "setInterval",
"name": null,
"intervalMs": null,
-- "line": 694,
++ "line": 703,
"file": "server/pastes/routes.js"
},
{
@@@ -8249,8 +8428,8 @@
],
"contractTodos": 0,
"unresolvedMounts": [],
-- "testFiles": 4,
-- "ci": false
++ "testFiles": 6,
++ "ci": true
},
{
"name": "OpenVibe.Tools",
@@@ -9513,25 +9692,79 @@
"service": "community",
"present": true,
"git": {
-- "head": "de947ead2addce29d7f9b98f3d894075ca4e82f2",
++ "head": "d7c6e608d8e27e6ddbfc78a15fa7590036b1dded",
"branch": "main",
-- "originMain": "de947ead2addce29d7f9b98f3d894075ca4e82f2",
-- "committedAt": "2026-09-21T09:58:34-07:00"
++ "originMain": "d7c6e608d8e27e6ddbfc78a15fa7590036b1dded",
++ "committedAt": "2026-09-22T16:32:05-07:00"
},
-- "sourceFiles": 11,
-- "loc": 1754,
++ "sourceFiles": 21,
++ "loc": 3950,
"tables": [
{
-- "table": "analytics_events",
-- "file": "vendor/openvibe-shared/analytics.js",
-- "line": 74,
-- "via": "vendored openvibe-shared"
++ "table": "pastes",
++ "file": "server/db.js",
++ "line": 18,
++ "via": "repo"
},
{
-- "table": "analytics_hourly",
-- "file": "vendor/openvibe-shared/analytics.js",
-- "line": 98,
-- "via": "vendored openvibe-shared"
++ "table": "paste_versions",
++ "file": "server/db.js",
++ "line": 54,
++ "via": "repo"
++ },
++ {
++ "table": "paste_likes",
++ "file": "server/db.js",
++ "line": 65,
++ "via": "repo"
++ },
++ {
++ "table": "paste_comments",
++ "file": "server/db.js",
++ "line": 72,
++ "via": "repo"
++ },
++ {
++ "table": "paste_visits",
++ "file": "server/db.js",
++ "line": 88,
++ "via": "repo"
++ },
++ {
++ "table": "subject_projection",
++ "file": "server/db.js",
++ "line": 98,
++ "via": "repo"
++ },
++ {
++ "table": "migration_runs",
++ "file": "server/db.js",
++ "line": 108,
++ "via": "repo"
++ },
++ {
++ "table": "legacy_id_map",
++ "file": "server/db.js",
++ "line": 116,
++ "via": "repo"
++ },
++ {
++ "table": "import_hold",
++ "file": "server/db.js",
++ "line": 125,
++ "via": "repo"
++ },
++ {
++ "table": "analytics_events",
++ "file": "vendor/openvibe-shared/analytics.js",
++ "line": 74,
++ "via": "vendored openvibe-shared"
++ },
++ {
++ "table": "analytics_hourly",
++ "file": "vendor/openvibe-shared/analytics.js",
++ "line": 98,
++ "via": "vendored openvibe-shared"
},
{
"table": "analytics_daily",
@@@ -9551,133 +9784,283 @@
"method": "GET",
"path": "/",
"file": "server/app.js",
-- "line": 106
++ "line": 146
},
{
"method": "GET",
"path": "/api/health",
"file": "server/app.js",
-- "line": 81
++ "line": 120
++ },
++ {
++ "method": "GET",
++ "path": "/api/pastes",
++ "file": "server/pastes/api.js",
++ "line": 102
++ },
++ {
++ "method": "POST",
++ "path": "/api/pastes",
++ "file": "server/pastes/api.js",
++ "line": 106
++ },
++ {
++ "method": "DELETE",
++ "path": "/api/pastes/:slug",
++ "file": "server/pastes/api.js",
++ "line": 124
++ },
++ {
++ "method": "GET",
++ "path": "/api/pastes/:slug",
++ "file": "server/pastes/api.js",
++ "line": 122
++ },
++ {
++ "method": "PUT",
++ "path": "/api/pastes/:slug",
++ "file": "server/pastes/api.js",
++ "line": 123
++ },
++ {
++ "method": "POST",
++ "path": "/api/pastes/:slug/ai",
++ "file": "server/pastes/api.js",
++ "line": 127
++ },
++ {
++ "method": "POST",
++ "path": "/api/pastes/:slug/censor",
++ "file": "server/pastes/api.js",
++ "line": 126
++ },
++ {
++ "method": "GET",
++ "path": "/api/pastes/:slug/comments",
++ "file": "server/pastes/api.js",
++ "line": 136
++ },
++ {
++ "method": "POST",
++ "path": "/api/pastes/:slug/comments",
++ "file": "server/pastes/api.js",
++ "line": 137
++ },
++ {
++ "method": "DELETE",
++ "path": "/api/pastes/:slug/comments/:commentId",
++ "file": "server/pastes/api.js",
++ "line": 140
++ },
++ {
++ "method": "POST",
++ "path": "/api/pastes/:slug/copy",
++ "file": "server/pastes/api.js",
++ "line": 134
++ },
++ {
++ "method": "POST",
++ "path": "/api/pastes/:slug/fork",
++ "file": "server/pastes/api.js",
++ "line": 132
++ },
++ {
++ "method": "POST",
++ "path": "/api/pastes/:slug/like",
++ "file": "server/pastes/api.js",
++ "line": 133
++ },
++ {
++ "method": "GET",
++ "path": "/api/pastes/:slug/raw",
++ "file": "server/pastes/api.js",
++ "line": 129
++ },
++ {
++ "method": "POST",
++ "path": "/api/pastes/:slug/set-avatar",
++ "file": "server/pastes/api.js",
++ "line": 143
++ },
++ {
++ "method": "GET",
++ "path": "/api/pastes/:slug/versions",
++ "file": "server/pastes/api.js",
++ "line": 130
++ },
++ {
++ "method": "DELETE",
++ "path": "/api/pastes/admin/forks",
++ "file": "server/pastes/api.js",
++ "line": 113
++ },
++ {
++ "method": "GET",
++ "path": "/api/pastes/admin/forks",
++ "file": "server/pastes/api.js",
++ "line": 112
++ },
++ {
++ "method": "GET",
++ "path": "/api/pastes/admin/stats",
++ "file": "server/pastes/api.js",
++ "line": 111
++ },
++ {
++ "method": "POST",
++ "path": "/api/pastes/bulk",
++ "file": "server/pastes/api.js",
++ "line": 114
++ },
++ {
++ "method": "GET",
++ "path": "/api/pastes/by-user/:username",
++ "file": "server/pastes/api.js",
++ "line": 119
++ },
++ {
++ "method": "GET",
++ "path": "/api/pastes/config",
++ "file": "server/pastes/api.js",
++ "line": 109
++ },
++ {
++ "method": "POST",
++ "path": "/api/pastes/screenshot",
++ "file": "server/pastes/api.js",
++ "line": 116
},
{
"method": "GET",
"path": "/api/ready",
"file": "server/app.js",
-- "line": 82
++ "line": 121
},
{
"method": "GET",
"path": "/callback",
"file": "server/auth/routes.js",
-- "line": 281
++ "line": 289
},
{
"method": "POST",
"path": "/fedcm",
"file": "server/auth/routes.js",
-- "line": 327
++ "line": 335
},
{
"method": "GET",
"path": "/feed.xml",
"file": "server/app.js",
-- "line": 99
++ "line": 138
},
{
"method": "GET",
"path": "/login",
"file": "server/auth/routes.js",
-- "line": 259
++ "line": 267
},
{
"method": "GET",
"path": "/logout",
"file": "server/auth/routes.js",
-- "line": 355
++ "line": 363
},
{
"method": "GET",
"path": "/me",
"file": "server/auth/routes.js",
-- "line": 379
++ "line": 387
},
{
"method": "GET",
"path": "/my",
"file": "server/app.js",
-- "line": 186
++ "line": 252
},
{
"method": "GET",
"path": "/new",
"file": "server/app.js",
-- "line": 150
++ "line": 214
},
{
"method": "POST",
"path": "/new",
"file": "server/app.js",
-- "line": 159
++ "line": 225
},
{
"method": "GET",
"path": "/p/:slug",
"file": "server/app.js",
-- "line": 119
++ "line": 159
},
{
"method": "GET",
"path": "/p/:slug/download",
"file": "server/app.js",
-- "line": 138
++ "line": 202
},
{
"method": "GET",
"path": "/p/:slug/raw",
"file": "server/app.js",
-- "line": 135
++ "line": 178
++ },
++ {
++ "method": "GET",
++ "path": "/p/:slug/raw",
++ "file": "server/app.js",
++ "line": 198
},
{
"method": "GET",
"path": "/p/:slug/screenshot",
"file": "server/app.js",
-- "line": 136
++ "line": 191
++ },
++ {
++ "method": "GET",
++ "path": "/p/:slug/screenshot",
++ "file": "server/app.js",
++ "line": 199
},
{
"method": "GET",
"path": "/pastes",
"file": "server/app.js",
-- "line": 111
++ "line": 151
},
{
"method": "GET",
"path": "/pastes/:slug",
"file": "server/app.js",
-- "line": 117
++ "line": 157
},
{
"method": "POST",
"path": "/refresh",
"file": "server/auth/routes.js",
-- "line": 389
++ "line": 397
},
{
"method": "GET",
"path": "/robots.txt",
"file": "server/app.js",
-- "line": 97
++ "line": 136
},
{
"method": "GET",
"path": "/sitemap.xml",
"file": "server/app.js",
-- "line": 98
++ "line": 137
},
{
"method": "GET",
"path": "/tos",
"file": "server/app.js",
-- "line": 75
++ "line": 82
}
],
"ws": {
@@@ -9730,6 +10113,18 @@
"server/config.js",
"vendor/openvibe-shared/brand.js"
],
++ "OV_MEDIA_INTERNAL_URL": [
++ "server/config.js"
++ ],
++ "PASTES_AUTHORITY": [
++ "server/config.js"
++ ],
++ "COMMUNITY_DB_PATH": [
++ "server/config.js"
++ ],
++ "VIEW_HASH_SECRET": [
++ "server/pastes/service.js"
++ ],
"LOGIN_URL": [
"vendor/openvibe-shared/brand.js"
],
@@@ -9800,35 +10195,35 @@
},
{
"via": "networkInternalUrl",
-- "line": 67
++ "line": 75
},
{
"via": "networkUrl",
-- "line": 67
++ "line": 75
},
{
"via": "/api/.well-known/jwks",
-- "line": 70
++ "line": 78
},
{
"via": "networkUrl",
-- "line": 146
++ "line": 154
},
{
"via": "networkInternalUrl",
-- "line": 227
++ "line": 235
},
{
"via": "networkUrl",
-- "line": 227
++ "line": 235
},
{
"via": "/oauth/token",
-- "line": 230
++ "line": 238
},
{
"via": "networkInternalUrl",
-- "line": 361
++ "line": 369
}
]
}
@@@ -10000,11 +10395,19 @@
"retry": true
}
],
-- "jobs": [],
++ "jobs": [
++ {
++ "kind": "setInterval",
++ "name": null,
++ "intervalMs": null,
++ "line": 211,
++ "file": "server/pastes/service.js"
++ }
++ ],
"contractTodos": 0,
"unresolvedMounts": [],
-- "testFiles": 8,
-- "ci": false
++ "testFiles": 14,
++ "ci": true
},
{
"name": "OpenVibe.Games",
@@@ -11018,77 +11421,221 @@
"state": "identical"
},
{
-- "repo": "OpenVibe.Tools",
-- "file": "ui.js",
-- "state": "identical"
++ "repo": "OpenVibe.Tools",
++ "file": "ui.js",
++ "state": "identical"
++ },
++ {
++ "repo": "OpenVibe.Tools",
++ "file": "url-resolver.js",
++ "state": "identical"
++ },
++ {
++ "repo": "OpenVibe.Tools",
++ "file": "user-card.js",
++ "state": "identical"
++ }
++ ],
++ "ownership": [
++ {
++ "repo": "OpenVibe.Community",
++ "table": "analytics_daily",
++ "declaredAt": [
++ "vendor/openvibe-shared/analytics.js:116"
++ ],
++ "prodDbs": [],
++ "inCode": true,
++ "inProd": false,
++ "target": "OpenVibe.Community",
++ "disposition": "keep",
++ "wave": "Track O / ADR-021",
++ "note": "Per-site analytics from vendored openvibe-shared/analytics.js. Raw analytics_events has no pruning (hazard H11)."
++ },
++ {
++ "repo": "OpenVibe.Community",
++ "table": "analytics_events",
++ "declaredAt": [
++ "vendor/openvibe-shared/analytics.js:74"
++ ],
++ "prodDbs": [],
++ "inCode": true,
++ "inProd": false,
++ "target": "OpenVibe.Community",
++ "disposition": "keep",
++ "wave": "Track O / ADR-021",
++ "note": "Per-site analytics from vendored openvibe-shared/analytics.js. Raw analytics_events has no pruning (hazard H11)."
++ },
++ {
++ "repo": "OpenVibe.Community",
++ "table": "analytics_hourly",
++ "declaredAt": [
++ "vendor/openvibe-shared/analytics.js:98"
++ ],
++ "prodDbs": [],
++ "inCode": true,
++ "inProd": false,
++ "target": "OpenVibe.Community",
++ "disposition": "keep",
++ "wave": "Track O / ADR-021",
++ "note": "Per-site analytics from vendored openvibe-shared/analytics.js. Raw analytics_events has no pruning (hazard H11)."
++ },
++ {
++ "repo": "OpenVibe.Community",
++ "table": "analytics_rate_tracking",
++ "declaredAt": [
++ "vendor/openvibe-shared/analytics.js:137"
++ ],
++ "prodDbs": [],
++ "inCode": true,
++ "inProd": false,
++ "target": "OpenVibe.Community",
++ "disposition": "keep",
++ "wave": "Track O / ADR-021",
++ "note": "Per-site analytics from vendored openvibe-shared/analytics.js. Raw analytics_events has no pruning (hazard H11)."
++ },
++ {
++ "repo": "OpenVibe.Community",
++ "table": "import_hold",
++ "declaredAt": [
++ "server/db.js:125"
++ ],
++ "prodDbs": [
++ "community.db"
++ ],
++ "inCode": true,
++ "inProd": true,
++ "target": "OpenVibe.Community",
++ "disposition": "keep",
++ "wave": "W5",
++ "note": ""
++ },
++ {
++ "repo": "OpenVibe.Community",
++ "table": "legacy_id_map",
++ "declaredAt": [
++ "server/db.js:116"
++ ],
++ "prodDbs": [
++ "community.db"
++ ],
++ "inCode": true,
++ "inProd": true,
++ "target": "OpenVibe.Community",
++ "disposition": "keep",
++ "wave": "W5",
++ "note": ""
++ },
++ {
++ "repo": "OpenVibe.Community",
++ "table": "migration_runs",
++ "declaredAt": [
++ "server/db.js:108"
++ ],
++ "prodDbs": [
++ "community.db"
++ ],
++ "inCode": true,
++ "inProd": true,
++ "target": "OpenVibe.Community",
++ "disposition": "keep",
++ "wave": "W5",
++ "note": ""
},
{
-- "repo": "OpenVibe.Tools",
-- "file": "url-resolver.js",
-- "state": "identical"
++ "repo": "OpenVibe.Community",
++ "table": "paste_comments",
++ "declaredAt": [
++ "server/db.js:72"
++ ],
++ "prodDbs": [
++ "community.db"
++ ],
++ "inCode": true,
++ "inProd": true,
++ "target": "OpenVibe.Community",
++ "disposition": "keep",
++ "wave": "W5",
++ "note": ""
},
{
-- "repo": "OpenVibe.Tools",
-- "file": "user-card.js",
-- "state": "identical"
-- }
-- ],
-- "ownership": [
++ "repo": "OpenVibe.Community",
++ "table": "paste_likes",
++ "declaredAt": [
++ "server/db.js:65"
++ ],
++ "prodDbs": [
++ "community.db"
++ ],
++ "inCode": true,
++ "inProd": true,
++ "target": "OpenVibe.Community",
++ "disposition": "keep",
++ "wave": "W5",
++ "note": ""
++ },
{
"repo": "OpenVibe.Community",
-- "table": "analytics_daily",
++ "table": "paste_versions",
"declaredAt": [
-- "vendor/openvibe-shared/analytics.js:116"
++ "server/db.js:54"
++ ],
++ "prodDbs": [
++ "community.db"
],
-- "prodDbs": [],
"inCode": true,
-- "inProd": false,
++ "inProd": true,
"target": "OpenVibe.Community",
"disposition": "keep",
-- "wave": "Track O / ADR-021",
-- "note": "Per-site analytics from vendored openvibe-shared/analytics.js. Raw analytics_events has no pruning (hazard H11)."
++ "wave": "W5",
++ "note": ""
},
{
"repo": "OpenVibe.Community",
-- "table": "analytics_events",
++ "table": "paste_visits",
"declaredAt": [
-- "vendor/openvibe-shared/analytics.js:74"
++ "server/db.js:88"
++ ],
++ "prodDbs": [
++ "community.db"
],
-- "prodDbs": [],
"inCode": true,
-- "inProd": false,
++ "inProd": true,
"target": "OpenVibe.Community",
"disposition": "keep",
-- "wave": "Track O / ADR-021",
-- "note": "Per-site analytics from vendored openvibe-shared/analytics.js. Raw analytics_events has no pruning (hazard H11)."
++ "wave": "W5",
++ "note": ""
},
{
"repo": "OpenVibe.Community",
-- "table": "analytics_hourly",
++ "table": "pastes",
"declaredAt": [
-- "vendor/openvibe-shared/analytics.js:98"
++ "server/db.js:18"
++ ],
++ "prodDbs": [
++ "community.db"
],
-- "prodDbs": [],
"inCode": true,
-- "inProd": false,
++ "inProd": true,
"target": "OpenVibe.Community",
"disposition": "keep",
-- "wave": "Track O / ADR-021",
-- "note": "Per-site analytics from vendored openvibe-shared/analytics.js. Raw analytics_events has no pruning (hazard H11)."
++ "wave": "W5",
++ "note": ""
},
{
"repo": "OpenVibe.Community",
-- "table": "analytics_rate_tracking",
++ "table": "subject_projection",
"declaredAt": [
-- "vendor/openvibe-shared/analytics.js:137"
++ "server/db.js:98"
++ ],
++ "prodDbs": [
++ "community.db"
],
-- "prodDbs": [],
"inCode": true,
-- "inProd": false,
++ "inProd": true,
"target": "OpenVibe.Community",
"disposition": "keep",
-- "wave": "Track O / ADR-021",
-- "note": "Per-site analytics from vendored openvibe-shared/analytics.js. Raw analytics_events has no pruning (hazard H11)."
++ "wave": "W5",
++ "note": ""
},
{
"repo": "OpenVibe.Games",
@@@ -14635,6 +15182,38 @@
"wave": "W1 (module split)",
"note": "Identity, sessions, OAuth, themes, notifications, registry, chrome, audit, admin."
},
++ {
++ "repo": "OpenVibe.Network",
++ "table": "principal_grants",
++ "declaredAt": [
++ "server/identity/principals.js:44"
++ ],
++ "prodDbs": [
++ "network.db"
++ ],
++ "inCode": true,
++ "inProd": true,
++ "target": "OpenVibe.Network",
++ "disposition": "keep",
++ "wave": "W1 (module split)",
++ "note": "Identity, sessions, OAuth, themes, notifications, registry, chrome, audit, admin."
++ },
++ {
++ "repo": "OpenVibe.Network",
++ "table": "principal_usage",
++ "declaredAt": [
++ "server/identity/principals.js:54"
++ ],
++ "prodDbs": [
++ "network.db"
++ ],
++ "inCode": true,
++ "inProd": true,
++ "target": "OpenVibe.Network",
++ "disposition": "keep",
++ "wave": "W1 (module split)",
++ "note": "Identity, sessions, OAuth, themes, notifications, registry, chrome, audit, admin."
++ },
{
"repo": "OpenVibe.Network",
"table": "push_subscriptions",
@@@ -14671,7 +15250,7 @@
"repo": "OpenVibe.Network",
"table": "stream_live_announcements",
"declaredAt": [
-- "server/internal/routes.js:310"
++ "server/internal/routes.js:325"
],
"prodDbs": [
"network.db"
@@@ -14764,6 +15343,22 @@
"wave": "W1 (module split)",
"note": "Identity, sessions, OAuth, themes, notifications, registry, chrome, audit, admin."
},
++ {
++ "repo": "OpenVibe.Network",
++ "table": "user_modules",
++ "declaredAt": [
++ "server/identity/modules.js:24"
++ ],
++ "prodDbs": [
++ "network.db"
++ ],
++ "inCode": true,
++ "inProd": true,
++ "target": "OpenVibe.Network",
++ "disposition": "keep",
++ "wave": "W1 (module split)",
++ "note": "Identity, sessions, OAuth, themes, notifications, registry, chrome, audit, admin."
++ },
{
"repo": "OpenVibe.Network",
"table": "user_preferences",
@@@ -14945,7 +15540,7 @@
"file": "server/auth/routes.js",
"target": "OpenVibe.Network",
"via": "/api/.well-known/jwks, networkUrl, networkInternalUrl, /oauth/token",
-- "lines": "49,57,58,67,67,70,146,227,227,230,361",
++ "lines": "49,57,58,75,75,78,154,235,235,238,369",
"auth": "oauth-client",
"timeout": true,
"retry": true
@@@ -15010,6 +15605,26 @@
"timeout": false,
"retry": false
},
++ {
++ "caller": "OpenVibe.Live",
++ "file": "server/media-proxy/pastes.js",
++ "target": "OpenVibe.Community",
++ "via": "OV_COMMUNITY_URL",
++ "lines": "311",
++ "auth": "none-detected",
++ "timeout": true,
++ "retry": true
++ },
++ {
++ "caller": "OpenVibe.Live",
++ "file": "server/pastes-client.js",
++ "target": "OpenVibe.Community",
++ "via": "OV_COMMUNITY_INTERNAL_URL",
++ "lines": "16",
++ "auth": "none-detected",
++ "timeout": true,
++ "retry": true
++ },
{
"caller": "OpenVibe.Live",
"file": "server/seo/seo.js",
@@@ -15085,10 +15700,20 @@
"file": "server/monetization/wallet-client.js",
"target": "OpenVibe.Network",
"via": "/internal/coins, OV_NETWORK_INTERNAL_URL, :4000",
-- "lines": "9,18,18,71,84,95,143",
++ "lines": "9,19,19,79,92,103,151",
"auth": "internal-key, bearer",
"timeout": true,
-- "retry": false
++ "retry": true
++ },
++ {
++ "caller": "OpenVibe.Live",
++ "file": "server/pastes-client.js",
++ "target": "OpenVibe.Network",
++ "via": "OV_NETWORK_INTERNAL_URL, :4000",
++ "lines": "39,39",
++ "auth": "none-detected",
++ "timeout": true,
++ "retry": true
},
{
"caller": "OpenVibe.Live",
@@@ -15115,10 +15740,10 @@
"file": "server/utils/notify.js",
"target": "OpenVibe.Network",
"via": "OV_NETWORK_INTERNAL_URL, :4000, /internal/notifications",
-- "lines": "16,16,60,114,137",
++ "lines": "16,16,66,120,143",
"auth": "internal-key",
"timeout": false,
-- "retry": false
++ "retry": true
},
{
"caller": "OpenVibe.Live",
@@@ -15195,7 +15820,7 @@
"file": "server/auth.js",
"target": "OpenVibe.Network",
"via": "network.url, /api/.well-known/jwks",
-- "lines": "28,28,83",
++ "lines": "29,29,84,99",
"auth": "none-detected",
"timeout": true,
"retry": true
@@@ -15255,7 +15880,7 @@
"file": "server/auth.js",
"target": "webhook",
"via": "webhook_url (per-app, configured in DB)",
-- "lines": "268",
++ "lines": "305",
"auth": "none-detected",
"timeout": true,
"retry": true
@@@ -15335,7 +15960,7 @@
"file": "server/index.js",
"target": "OpenVibe.Live",
"via": ":3000, live.internalUrl",
-- "lines": "215,289,477",
++ "lines": "215,289,479",
"auth": "internal-key, bearer",
"timeout": false,
"retry": false
@@@ -15571,6 +16196,15 @@
],
"prod": "community.env"
},
++ {
++ "repo": "OpenVibe.Community",
++ "name": "COMMUNITY_DB_PATH",
++ "secret": false,
++ "files": [
++ "server/config.js"
++ ],
++ "prod": null
++ },
{
"repo": "OpenVibe.Community",
"name": "COOKIE_SECURE",
@@@ -15707,6 +16341,15 @@
],
"prod": null
},
++ {
++ "repo": "OpenVibe.Community",
++ "name": "OV_MEDIA_INTERNAL_URL",
++ "secret": false,
++ "files": [
++ "server/config.js"
++ ],
++ "prod": null
++ },
{
"repo": "OpenVibe.Community",
"name": "OV_MEDIA_URL",
@@@ -15817,6 +16460,15 @@
],
"prod": null
},
++ {
++ "repo": "OpenVibe.Community",
++ "name": "PASTES_AUTHORITY",
++ "secret": false,
++ "files": [
++ "server/config.js"
++ ],
++ "prod": "community.env"
++ },
{
"repo": "OpenVibe.Community",
"name": "PORT",
@@@ -15835,6 +16487,15 @@
],
"prod": "community.env"
},
++ {
++ "repo": "OpenVibe.Community",
++ "name": "VIEW_HASH_SECRET",
++ "secret": true,
++ "files": [
++ "server/pastes/service.js"
++ ],
++ "prod": null
++ },
{
"repo": "OpenVibe.Games",
"name": "DB_PATH",
@@@ -16181,6 +16842,7 @@
"server/chat/chat-server.js",
"server/config.js",
"server/monetization/wallet-client.js",
++ "server/net/network-principal.js",
"server/streaming/routes.js",
"server/utils/notify.js"
],
@@@ -16474,12 +17136,22 @@
],
"prod": null
},
++ {
++ "repo": "OpenVibe.Live",
++ "name": "OV_COMMUNITY_INTERNAL_URL",
++ "secret": false,
++ "files": [
++ "server/pastes-client.js"
++ ],
++ "prod": null
++ },
{
"repo": "OpenVibe.Live",
"name": "OV_COMMUNITY_URL",
"secret": false,
"files": [
"server/index.js",
++ "server/media-proxy/pastes.js",
"server/seo/seo.js",
"vendor/openvibe-shared/brand.js"
],
@@@ -16538,6 +17210,7 @@
"server/chat/chat-server.js",
"server/config.js",
"server/monetization/wallet-client.js",
++ "server/net/network-principal.js",
"server/streaming/routes.js",
"server/utils/notify.js"
],
@@@ -16595,6 +17268,8 @@
"files": [
"server/chat/chat-server.js",
"server/monetization/wallet-client.js",
++ "server/net/network-principal.js",
++ "server/pastes-client.js",
"server/utils/notify.js"
],
"prod": "live.env"
@@@ -16634,7 +17309,8 @@
"name": "OV_OAUTH_CLIENT_ID",
"secret": false,
"files": [
-- "server/auth/routes.js"
++ "server/auth/routes.js",
++ "server/net/network-principal.js"
],
"prod": "live.env"
},
@@@ -16643,7 +17319,8 @@
"name": "OV_OAUTH_CLIENT_SECRET",
"secret": true,
"files": [
-- "server/auth/routes.js"
++ "server/auth/routes.js",
++ "server/net/network-principal.js"
],
"prod": "live.env"
},
@@@ -16701,6 +17378,15 @@
],
"prod": null
},
++ {
++ "repo": "OpenVibe.Live",
++ "name": "PASTES_AUTHORITY",
++ "secret": false,
++ "files": [
++ "server/pastes-client.js"
++ ],
++ "prod": "live.env"
++ },
{
"repo": "OpenVibe.Live",
"name": "PASTES_ON_COMMUNITY",
@@@ -17576,6 +18262,23 @@
],
"prod": null
},
++ {
++ "repo": "OpenVibe.Media",
++ "name": "PASTES_FROZEN_APPS",
++ "secret": false,
++ "files": [
++ "server/pastes/routes.js"
++ ],
++ "prod": "media.env"
++ },
++ {
++ "repo": "OpenVibe.Media",
++ "name": "PASTES_MOVED_TO",
++ "secret": false,
++ "files": [],
++ "prod": "media.env",
++ "unreferenced": true
++ },
{
"repo": "OpenVibe.Media",
"name": "PASTES_PATH",
@@@ -18697,6 +19400,12 @@
"subject": "OpenVibe.Community:COOKIE_SECURE",
"detail": "secret-named variable read by code but not set in the service env file: verify it is optional or has no hardcoded fallback"
},
++ {
++ "severity": "low",
++ "area": "env",
++ "subject": "OpenVibe.Community:VIEW_HASH_SECRET",
++ "detail": "secret-named variable read by code but not set in the service env file: verify it is optional or has no hardcoded fallback"
++ },
{
"severity": "low",
"area": "env",
@@@ -19195,6 +19904,12 @@
"subject": "OpenVibe.Live:UNSAFE_WORDS_PATH",
"detail": "set in live.env but not referenced by scanned code (may be read by a dependency or stale)"
},
++ {
++ "severity": "info",
++ "area": "env",
++ "subject": "OpenVibe.Media:PASTES_MOVED_TO",
++ "detail": "set in media.env but not referenced by scanned code (may be read by a dependency or stale)"
++ },
{
"severity": "info",
"area": "env",
@@@ -19243,6 +19958,30 @@
"subject": "OpenVibe.Tools:MEDIA_URL",
"detail": "set in tools.env but not referenced by scanned code (may be read by a dependency or stale)"
},
++ {
++ "severity": "info",
++ "area": "schema",
++ "subject": "OpenVibe.Community:analytics_daily",
++ "detail": "declared in code but absent from every production database for this service (lazy/unused/legacy migration)"
++ },
++ {
++ "severity": "info",
++ "area": "schema",
++ "subject": "OpenVibe.Community:analytics_events",
++ "detail": "declared in code but absent from every production database for this service (lazy/unused/legacy migration)"
++ },
++ {
++ "severity": "info",
++ "area": "schema",
++ "subject": "OpenVibe.Community:analytics_hourly",
++ "detail": "declared in code but absent from every production database for this service (lazy/unused/legacy migration)"
++ },
++ {
++ "severity": "info",
++ "area": "schema",
++ "subject": "OpenVibe.Community:analytics_rate_tracking",
++ "detail": "declared in code but absent from every production database for this service (lazy/unused/legacy migration)"
++ },
{
"severity": "info",
"area": "schema",
@@@ -19319,15 +20058,15 @@
"metrics": {
"github.charters": "20 charter-only repos of 32",
"contract.todo-markers": "Live 15, Network 0, Media 0, Tools 0, Community 0, Games 0, Sites 0",
-- "outbound.call-sites": "65 caller-file/target pairs across 50 files",
-- "outbound.internal-key": "28 of 65 call sites authenticate with the shared internal key",
++ "outbound.call-sites": "68 caller-file/target pairs across 52 files",
++ "outbound.internal-key": "28 of 68 call sites authenticate with the shared internal key",
"ws.servers": "10 WebSocket server constructions",
"tables.analytics-copies": "5 repos carry their own analytics_events",
"vendored.copies": "5 repos vendor openvibe-shared (129 files)",
"vendored.divergent": "4 divergent: Community/ov-icons.js, Live/user-card.js, Media/ov-icons.js, Tools/ov-icons.js",
-- "ci.repos": "0 of 7 scanned repos have .github/workflows",
++ "ci.repos": "4 of 7 scanned repos have .github/workflows",
"deploy.drift": "1 service(s) not running origin/main",
-- "tests.OpenVibe.Live": "56 test files",
++ "tests.OpenVibe.Live": "58 test files",
"tables.OpenVibe.Live": "125 tables",
"tables.OpenVibe.Live.target:OpenVibe.Games (import source)": "31 Live tables target OpenVibe.Games (import source)",
"tables.OpenVibe.Live.target:OpenVibe.AI": "14 Live tables target OpenVibe.AI",
@@@ -19346,21 +20085,21 @@
"tables.OpenVibe.Live.target:OpenVibe.Billing": "2 Live tables target OpenVibe.Billing",
"tables.OpenVibe.Live.target:OpenVibe.Billing + OpenVibe.VIP": "1 Live tables target OpenVibe.Billing + OpenVibe.VIP",
"tables.OpenVibe.Live.target:OpenVibe.Codes": "2 Live tables target OpenVibe.Codes",
-- "tests.OpenVibe.Network": "18 test files",
-- "tables.OpenVibe.Network": "36 tables",
-- "tables.OpenVibe.Network.target:OpenVibe.Network": "33 Network tables target OpenVibe.Network",
++ "tests.OpenVibe.Network": "20 test files",
++ "tables.OpenVibe.Network": "39 tables",
++ "tables.OpenVibe.Network.target:OpenVibe.Network": "36 Network tables target OpenVibe.Network",
"tables.OpenVibe.Network.target:OpenVibe.Billing (loyalty ledger)": "2 Network tables target OpenVibe.Billing (loyalty ledger)",
"tables.OpenVibe.Network.target:OpenVibe.Events": "1 Network tables target OpenVibe.Events",
-- "tests.OpenVibe.Media": "4 test files",
++ "tests.OpenVibe.Media": "6 test files",
"tables.OpenVibe.Media": "15 tables",
"tables.OpenVibe.Media.target:OpenVibe.Media": "12 Media tables target OpenVibe.Media",
"tables.OpenVibe.Media.target:OpenVibe.Community": "3 Media tables target OpenVibe.Community",
"tests.OpenVibe.Tools": "2 test files",
"tables.OpenVibe.Tools": "4 tables",
"tables.OpenVibe.Tools.target:OpenVibe.Tools": "4 Tools tables target OpenVibe.Tools",
-- "tests.OpenVibe.Community": "8 test files",
-- "tables.OpenVibe.Community": "4 tables",
-- "tables.OpenVibe.Community.target:OpenVibe.Community": "4 Community tables target OpenVibe.Community",
++ "tests.OpenVibe.Community": "14 test files",
++ "tables.OpenVibe.Community": "13 tables",
++ "tables.OpenVibe.Community.target:OpenVibe.Community": "13 Community tables target OpenVibe.Community",
"tests.OpenVibe.Games": "56 test files",
"tables.OpenVibe.Games": "5 tables",
"tables.OpenVibe.Games.target:OpenVibe.Games": "5 Games tables target OpenVibe.Games",
@@@ -19492,7 +20231,7 @@
"metrics": [
{
"key": "outbound.call-sites",
-- "value": "65 caller-file/target pairs across 50 files"
++ "value": "68 caller-file/target pairs across 52 files"
},
{
"key": "ws.servers",
@@@ -19599,7 +20338,7 @@
"metrics": [
{
"key": "tables.OpenVibe.Community",
-- "value": "4 tables"
++ "value": "13 tables"
},
{
"key": "tables.OpenVibe.Live.target:OpenVibe.Community",
@@@ -19754,7 +20493,7 @@
"metrics": [
{
"key": "outbound.internal-key",
-- "value": "28 of 65 call sites authenticate with the shared internal key"
++ "value": "28 of 68 call sites authenticate with the shared internal key"
}
],
"verified": true
@@@ -19877,7 +20616,7 @@
"metrics": [
{
"key": "ci.repos",
-- "value": "0 of 7 scanned repos have .github/workflows"
++ "value": "4 of 7 scanned repos have .github/workflows"
}
],
"verified": true
@@@ -19972,7 +20711,7 @@
"mitigation": "Browser harness must support a remote/containerised runner; prune ~/.claude transcripts (~1.2 GB).",
"status": "open",
"check": "workstation-disk",
-- "checkResult": "workstation / is 82% used (at generation time)"
++ "checkResult": "workstation / is 83% used (at generation time)"
},
{
"id": "H8",
@@@ -20068,25 +20807,25 @@
"id": "EC1",
"text": "Every table has an owner classification",
"pass": true,
-- "detail": "250 tables classified, 0 unclassified"
++ "detail": "262 tables classified, 0 unclassified"
},
{
"id": "EC2",
"text": "Every route is attributed to a repo and source line",
"pass": true,
-- "detail": "928 routes; 0 router mounts whose module could not be resolved (their routes are listed without the mount prefix)"
++ "detail": "968 routes; 0 router mounts whose module could not be resolved (their routes are listed without the mount prefix)"
},
{
"id": "EC3",
"text": "Every background job is listed with its location",
"pass": true,
-- "detail": "82 timers/jobs"
++ "detail": "83 timers/jobs"
},
{
"id": "EC4",
"text": "Every cross-service call records caller, callee, auth, timeout and retry",
"pass": true,
-- "detail": "65 call sites; 30 with no timeout detected"
++ "detail": "68 call sites; 30 with no timeout detected"
},
{
"id": "EC5",