openvibers/openvibe.report STATUS.json

STATUS.json

main 5.0 KB · 71 lines · 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