openvibers/openvibe.watch STATUS.json
STATUS.json
| 1 | { |
| 2 | "repository": "OpenVibers/OpenVibe.Watch", |
| 3 | "stage": "alpha", |
| 4 | "code": true, |
| 5 | "wave": "W18", |
| 6 | "plan": "OpenVibe End-to-End Realignment & Implementation Plan, revision 3 (20 Sep 2026) — T18 Watch complete, steps 2-3 (registry, engine, pull carriers) and step 8 (the public site)", |
| 7 | "runtime": "node 22, express, PostgreSQL 18 (openvibe-sdk/db, async) + Valkey 9, fast-xml-parser", |
| 8 | "port": 4730, |
| 9 | "domain": "openvibe.watch (a public server-rendered site + a loopback-only API; vhost in deploy/nginx; README \"Public site\" and \"Public host\")", |
| 10 | "contracts": "openvibe-contracts v0.419.0 (watch.rate.* events; actor-agent requires v0.143.0)", |
| 11 | "sdk": "openvibe-sdk v0.161.0", |
| 12 | "shared": "openvibe-shared v4.237.0", |
| 13 | "capabilities": [ |
| 14 | "watch.watch.read", |
| 15 | "watch.watch.manage", |
| 16 | "watch.observation.read", |
| 17 | "watch.check.run", |
| 18 | "watch.resource.read" |
| 19 | ], |
| 20 | "capabilitiesRegistered": true, |
| 21 | "contractsUsed": [ |
| 22 | "watch.watch@1, watch.watch-request@1, watch.watch-result@1", |
| 23 | "watch.observation@1, watch.check-run@1", |
| 24 | "watch.observation.recorded@1, watch.watch.triggered@1, watch.check.failed@1", |
| 25 | "common.resource-summary@1, common.resource-list-result@1" |
| 26 | ], |
| 27 | "carriers": [ |
| 28 | "http", |
| 29 | "feed", |
| 30 | "api" |
| 31 | ], |
| 32 | "carriersPending": [ |
| 33 | "event (step 5)", |
| 34 | "webhook (step 5)", |
| 35 | "run (step 6)", |
| 36 | "node (step 7)" |
| 37 | ], |
| 38 | "actionKinds": [ |
| 39 | "notification", |
| 40 | "event", |
| 41 | "webhook", |
| 42 | "actor-task", |
| 43 | "actor-agent", |
| 44 | "codes-run", |
| 45 | "run-job" |
| 46 | ], |
| 47 | "seededWatches": 0, |
| 48 | "deployed": true, |
| 49 | "deployment": "openvibe-ovh: unit openvibe-watch.service on 127.0.0.1:4730 (release layout /opt/openvibe.watch, env /etc/openvibe/watch.env, database ov_watch), deployed with `sudo ovhost deploy watch`; the public site openvibe.watch (sign-in, watch management, plan T18 step 8) has been live since 2026-10-08. On 2026-10-10 it held no watches yet, so no check has run against a real site in production.", |
| 50 | "works": [ |
| 51 | "the watch registry with owner scoping (404 for another owner) validated against the released contracts", |
| 52 | "the check engine: conditional GET (ETag/Last-Modified, HEAD-first for change-only), 304/unchanged-body short circuits, recorded states, backoff and Retry-After", |
| 53 | "SSRF-guarded fetching (ports, private hosts, every redirect hop, byte cap, one deadline) and per-host spacing", |
| 54 | "the http, feed (RSS/Atom) and api carriers", |
| 55 | "extraction (text, html, css subset, json/jsonpath, regex) and conditions (changed/threshold/string, for_sec)", |
| 56 | "observations with value hashes, capped snapshots and retention; check runs with the full state set", |
| 57 | "the loopback-only API (one capability per route), watch.* events through openvibe-sdk's transactional service_outbox, per-actor limits", |
| 58 | "the public site: sign-in with OpenVibe.Network (OAuth2 + PKCE S256, sessions in Watch's database), the home page and four starting points, /watches (paged), the create and edit forms (server-side fieldsets, validation errors that keep the input), one watch with pause/resume/delete/check-now, the observation history and check runs, /how-it-works, /updates, and robots/sitemap/llms.txt", |
| 59 | "the site calls the registry in-process with the API's ownership rules (another person's watch is 404 on every page and form) and refuses cross-site writes" |
| 60 | ], |
| 61 | "notYet": [ |
| 62 | "no check has run against a real external site in production yet: on 2026-10-10 nobody had created a watch (the tests use stub sites only)", |
| 63 | "the event and webhook carriers (step 5), the Run rung (step 6), Link probes (step 7) and the actions (step 4): a watch of such a kind is accepted but never fetched", |
| 64 | "an ai extraction is not a check (step 10); such a watch is recorded skipped and nothing is fetched", |
| 65 | "the site offers only page/price/feed/json watches: the kinds and the AI reading above are not in the form", |
| 66 | "notifications are the watch.watch.triggered event OpenVibe.Network turns into WATCH_TRIGGERED; no other action is dispatched" |
| 67 | ], |
| 68 | "features": [ |
| 69 | "watch registry with owner scoping (404 for another owner) validated against the released contracts", |
| 70 | "binding carrier preference order: webhook/event → ETag/Last-Modified → feed → API → Run", |
| 71 | "conditional GET: If-None-Match/If-Modified-Since, HEAD-first when only change is needed, 304 and unchanged-body short circuits", |
| 72 | "SSRF-guarded fetcher (ports, private hosts, every redirect hop, byte cap, one deadline) and per-host spacing", |
| 73 | "feed (RSS/Atom) and mapped-API carriers", |
| 74 | "extraction: text, html, css subset, json/jsonpath, regex; ai refused as a later step", |
| 75 | "conditions: changed/threshold with tolerance and percent, for_sec debounce over the observation trail", |
| 76 | "observations with value hashes, capped snapshots and retention", |
| 77 | "check runs with the full terminal-state set, exponential backoff and Retry-After", |
| 78 | "POST /api/v1/watches/:id/check plus the observations and checks reads", |
| 79 | "GET /api/v1/resources and GET /api/v1/resources/:ovrn (watch.resource.read)", |
| 80 | "watch.* events through openvibe-sdk's service_outbox in the same transaction as the state change", |
| 81 | "per-actor limits (openvibe-sdk/limits)", |
| 82 | "usage readings (check operations): one platform.usage-sample@1 check-operation reading per completed check run, relayed to OpenVibe.Billing (billing.usage.record) by openvibe-sdk/usage; off by default (WATCH_BILLING_INTERVAL_MS)", |
| 83 | "the public site: Network sign-in (PKCE S256, web_sessions with only the token hash), server-rendered pages complete without JavaScript, the four create templates, watch management, observation history and check runs, how-it-works and the changelog, robots/sitemap/llms.txt", |
| 84 | "provider-rate evidence (plan P6, WATCH_PROVIDER_RATES off by default): DeepInfra and Featherless AI official price documents parsed into integer nano-USD-per-million supply rate observations (D1), a pending Watch change when a rate differs, and a person's approval recorded as evidence only — no rate card is written and nothing is billable" |
| 85 | ], |
| 86 | "updated": "2026-11-13" |
| 87 | } |
| 88 |