openvibers/openvibe.report STATUS.json
STATUS.json
| 1 | { |
| 2 | "repository": "OpenVibers/OpenVibe.Report", |
| 3 | "version": "0.1.0", |
| 4 | "stage": "analytics-authority-shadow", |
| 5 | "code": true, |
| 6 | "wave": "W21", |
| 7 | "plan": "REP-2 (plan 2026-10-28 §4.8 and §5.4): Report's own analytics database, ingest, shadow comparison and the Billing revenue read; no cutover", |
| 8 | "runtime": "node 22, express 4, PostgreSQL (PGlite in development), no sessions", |
| 9 | "port": "5080", |
| 10 | "domain": "openvibe.report", |
| 11 | "contracts": "openvibe-contracts v0.421.0", |
| 12 | "sdk": "openvibe-sdk v0.161.0", |
| 13 | "shared": "openvibe-shared v4.235.0", |
| 14 | "packages": [ |
| 15 | "openvibe-contracts v0.421.0", |
| 16 | "openvibe-publishing v1.7.0", |
| 17 | "openvibe-sdk v0.161.0", |
| 18 | "openvibe-shared v4.235.0", |
| 19 | "pg v8.23.1", |
| 20 | "pglite v0.5.13 (dev)" |
| 21 | ], |
| 22 | "summary": "OpenVibe.Report keeps its own PostgreSQL analytics store (migrations/), ingests Network's live.stream.ended and frame beacon plus its open-stats answer idempotently (report_inbox), computes the same site-wide, per-site and per-channel numbers by day, quotes Billing's revenue through Billing's read API, and runs a shadow job that records every difference from Network in report_shadow_diffs with GET /internal/shadow on loopback. REPORT_SOURCE=network (default) keeps the pages on today's Network numbers; REPORT_SOURCE=report answers them from Report's tables. The Rundown and after-show pages still read OpenVibe.Live. The AI section reads OpenVibe.Bench's public API: /ai, /ai/<benchmark>, /ai/models/<model>, /ai/compare, /ai/method, /ai/feed.xml and /api/v1/ai/results; Bench's old HTML pages 301 here.", |
| 23 | "works": [ |
| 24 | "Database: server/db.js (openvibe-sdk/db, migrations at boot; PostgreSQL through PgBouncer, PGlite in development) and test/helpers/db.js (createTestDb)", |
| 25 | "Tables: report_inbox, report_events, report_streams, report_frame_days, report_metric_days, report_metric_windows, report_metric_json, report_dimensions, report_shadow_runs, report_shadow_diffs", |
| 26 | "Ingest: live.stream.ended → report_streams and channel/day counts; network.frame.hit/day → report_frame_days; GET /api/v1/stats → day and window metrics, JSON lists and site dimensions; every write claimed in report_inbox in the same transaction", |
| 27 | "Read: reportStats() reproduces GET /api/v1/stats (totals, sites, pageviews_daily, accounts, coins, live, busiest pages); channelStats() reproduces creator analytics from report_streams and adds Billing revenue; metrics() returns report.metric@1 rows", |
| 28 | "Billing: GET /api/v1/stats with billing.stats.read; GET /api/v1/transactions?subject= with billing.balance.read for settled creator_payable revenue/refunds; service token via Network client-credentials or REPORT_BILLING_TOKEN; never derives a price", |
| 29 | "Shadow: server/analytics/shadow.js compares the same window from Network and Report, records report_shadow_runs + report_shadow_diffs; GET/POST /internal/shadow (loopback)", |
| 30 | "Jobs: ingest 7/30/90-day windows every 5 minutes and shadow every 15 minutes (server/jobs/analytics.js), on by default; REPORT_JOBS=0 turns them off", |
| 31 | "Events: POST /internal/events with Events v2 HMAC, loopback only", |
| 32 | "Source switch: REPORT_SOURCE=network|report (default network) for /, /stats and GET /api/v1/stats", |
| 33 | "Tests: ingest idempotency, every metric from a fixture, shadow difference and clean run, source flag, Billing stub, signed Events delivery, and the existing pages/API/health/crawl tests" |
| 34 | ], |
| 35 | "notYet": [ |
| 36 | "Cutover: REPORT_SOURCE stays network; Network and Live keep answering until the shadow is clean for a full window", |
| 37 | "Report's first-party grants on Network (billing.stats.read, billing.balance.read, and the Network analytics grant when creator analytics is pulled directly) are not created by this change", |
| 38 | "No report service manifest or capabilities are registered in openvibe-contracts yet; report.metric@1 is proposed in docs/report.metric.v1.json", |
| 39 | "The ingest job reads Network's open-stats answer; it does not call Network's creator analytics endpoint (channels come from live.stream.ended)", |
| 40 | "The Rundown and after-show pages remain Live reads until Report takes those products" |
| 41 | ], |
| 42 | "capabilitiesUsed": [ |
| 43 | "billing.stats.read", |
| 44 | "billing.balance.read" |
| 45 | ], |
| 46 | "capabilitiesRegistered": false, |
| 47 | "serviceManifestRegistered": false, |
| 48 | "deployed": false, |
| 49 | "placeholderInSites": false, |
| 50 | "features": [ |
| 51 | "analytics ingest with an event-id inbox", |
| 52 | "site and channel metrics by day", |
| 53 | "Billing revenue read", |
| 54 | "shadow comparison and /internal/shadow", |
| 55 | "REPORT_SOURCE switch", |
| 56 | "report.metric@1", |
| 57 | "open network stats", |
| 58 | "The Rundown", |
| 59 | "after-show reports", |
| 60 | "server-rendered pages", |
| 61 | "JSON API", |
| 62 | "crawl artifacts", |
| 63 | "readiness", |
| 64 | "deploy files", |
| 65 | "AI section from OpenVibe.Bench", |
| 66 | "AI results RSS and JSON" |
| 67 | ], |
| 68 | "deployment": "planned: openvibe-ovh, unit openvibe-report.service on 127.0.0.1:5080 (git checkout /opt/openvibe.report, env /etc/openvibe/report.env), public at https://openvibe.report; DATABASE_URL/DATABASE_DIRECT_URL from OpenVibe.Host roles/data add-service.sh report", |
| 69 | "updated": "2026-11-13" |
| 70 | } |
| 71 |