openvibers/openvibe.help STATUS.json
STATUS.json
| 1 | { |
| 2 | "repository": "OpenVibers/OpenVibe.Help", |
| 3 | "stage": "product", |
| 4 | "code": true, |
| 5 | "wave": "W20", |
| 6 | "plan": "OpenVibe.Help: a help centre generated from OpenVibe.Contracts at boot, search over it and over OpenVibe.Search, and support tickets that stay one conversation", |
| 7 | "runtime": "node 22, express 4, PostgreSQL 18 (openvibe-sdk/db, async) + Valkey 9", |
| 8 | "port": "5020", |
| 9 | "domain": "openvibe.help", |
| 10 | "contracts": "openvibe-contracts v0.419.0", |
| 11 | "sdk": "openvibe-sdk v0.161.0", |
| 12 | "shared": "openvibe-shared v4.235.0", |
| 13 | "packages": [ |
| 14 | "openvibe-contracts v0.419.0", |
| 15 | "openvibe-sdk v0.161.0", |
| 16 | "openvibe-shared v4.235.0", |
| 17 | "openvibe-publishing v1.7.0" |
| 18 | ], |
| 19 | "summary": "The help and support centre for every OpenVibe site. The help centre is generated at boot from openvibe-contracts (every product manifest and every service manifest's site block): one page per site, one page per question, each text quoted verbatim with its manifest named. /search searches those articles with a fixed explainable score and the network through OpenVibe.Search's public API (cached 5 minutes, degrading to the articles alone when it fails). A signed-in person opens a support ticket that stays one conversation — site, subject, message, an optional page URL stored as text and never fetched — sees only their own, and replies; staff by their Network role claim read the queue, filter it and set the state. Tickets live in PostgreSQL (migrations/0002_tickets.sql), writes made with the session cookie must be same-origin, and opening and answering are limited per caller. Sign-in is OpenVibe.Network (OAuth 2 + PKCE), the pages are server-rendered through the OpenVibe Frame and work without JavaScript, and the crawl artifacts cover every site and every question.", |
| 20 | "works": [ |
| 21 | "Help articles generated at boot from openvibe-contracts: 45 sites (22 live, 23 coming) and 20 questions across the 3 sites whose manifest carries an faq, quoted verbatim with provenance (manifest path, link back, read time)", |
| 22 | "/sites, /sites/:id (pillars as \"what you can do\", the FAQ as anchored articles, links to the site and its /updates) and /a/:site/:slug (one question per page, the question as the title)", |
| 23 | "Search: a fixed score over question/answer/site text for the help articles, plus OpenVibe.Search's public API in a second section; a 5-minute in-process cache, and a failure shown as a failure", |
| 24 | "Support tickets: create, list your own, one conversation per ticket, reply, staff queue with filters and open|waiting|solved, all in help_tickets and help_messages", |
| 25 | "Privacy: another person's ticket is a 404, anonymous is 401, an app token cannot act as a person, and a write with the session cookie must come from openvibe.help", |
| 26 | "Bodies are plain text, escaped with line breaks kept, capped at 10 000 characters; a page URL is stored as text and never fetched", |
| 27 | "Per-caller limits: help.ticket.create 6 a minute / 60 an hour, help.ticket.message 30 / 300", |
| 28 | "The API at /api/v1 with the problem+json error shape: sites, articles, tickets, staff", |
| 29 | "Crawl artifacts: a sitemap and llms-full.txt built from one page list (every site, every question), llms.txt listing the sites, JSON-LD for the home page, a site and a question", |
| 30 | "Sign-in with OpenVibe.Network (PKCE S256, server-side code exchange, httpOnly session cookies)", |
| 31 | "Truthful readiness (/api/ready: the database is required) and Prometheus metrics on loopback", |
| 32 | "Tests: the catalog against the manifests, escaping, search scoring with an OpenVibe.Search stand-in, and the whole ticket lifecycle including limits", |
| 33 | "Account export and deletion (ADR-033): the tickets a person opened and every message they wrote are exported to OpenVibe.Network on network.account.export_requested; on network.account.deleted their own tickets (and, by cascade, every message under them) are erased while a staff reply they left in someone else's ticket is anonymized, with the counts confirmed back; the two Events topics are subscribed at boot (server/identity/account-data.js)" |
| 34 | ], |
| 35 | "notYet": [ |
| 36 | "Capabilities of its own: its service manifest is in openvibe-contracts (manifests/services/help.json) with an empty capabilities list, so CAPABILITIES in server/http/principal.js is empty and no other service calls Help", |
| 37 | "An email side to a ticket: today one conversation on the web, not yet the same thread by email", |
| 38 | "A \"Report a problem\" button on every other OpenVibe site (the product manifest's own launch note); a ticket can name a site but no site embeds the form yet", |
| 39 | "Answers drawn from the docs, wiki, blog and service status (the product manifest's description): today the articles are the sites' own manifests, and the network half of /search is what covers the rest" |
| 40 | ], |
| 41 | "capabilitiesRegistered": false, |
| 42 | "serviceManifestRegistered": true, |
| 43 | "deployed": true, |
| 44 | "placeholderInSites": false, |
| 45 | "features": [ |
| 46 | "generated help articles", |
| 47 | "search (articles + OpenVibe.Search)", |
| 48 | "support tickets", |
| 49 | "staff queue", |
| 50 | "Network sign-in", |
| 51 | "server-rendered pages", |
| 52 | "api mount", |
| 53 | "limits and readiness", |
| 54 | "discovery", |
| 55 | "deploy files" |
| 56 | ], |
| 57 | "deployment": "openvibe-ovh: unit openvibe-help.service on 127.0.0.1:5020 (git checkout /opt/openvibe.help, env /etc/openvibe/help.env, database ov_help), deployed with `sudo ovhost deploy help`; public at https://openvibe.help since 2026-10-08.", |
| 58 | "updated": "2026-11-13" |
| 59 | } |
| 60 |