Commits
-
Document COUPONSEVENTSSECRET in .env.example beside EVENTSURL (#6)OpenVibers · 3 Oct 2026
33e37b6 -
Coupons tells search engines when a page changes (plan T11, IndexNow): with INDEXNOW_KEY set the key file is served at /<key>.txt and an indexable page appearing, changing or going away pings the engines (its path and the sitemap); drafts, private and noindex pages never; unset, nothing is mounted or sent. A home-page performance budget runs in CI where there was none. Tests green (verified).OpenVibers · 29 Sept 2026
36f2f08 -
The SQLite era is gone (on PostgreSQL since 2026-09-28; no compatibility kept): the one-time migrate-to-postgres script, *_DB_PATH settings (config, .env.example, systemd unit, test helpers), the unused better-sqlite3 dependency and its lockfile entries, and docs, docstrings and STATUS lines about SQLite or its rollback window. Reviewed independently before shipping. npm test 13/13 test files passed.OpenVibers · 29 Sept 2026
74240ba -
Coupons moves to PostgreSQL and Valkey (ADR-035, roadmap WS-X2, repository-pass group G1), async from end to end.OpenVibers · 28 Sept 2026
040dc3e -
Per-actor rate limits on Coupons' /api/v1 and its page forms (roadmap WS-R task 4, openvibe-sdk v0.12.0 limits). server/http/actor-limits.js makes one limiter per app and counts requests once req.viewer is resolved. A person counts as user:usr_…, whether they call with their Network token, a service names them in X-OV-Subject, or one of their browser helpers sends the request with its cpx_ install token. Every browser a person connected counts together, never by the address it reports from. A first-party service relaying a signed-out visitor counts by the address it forwards. A service or app acting as itself, such as svc:ai for coupons.extract_coupon, counts by its principal. A signed-out caller counts by address. A first-party service reading for itself is not counted on reads, since the lookup limiter already bounds it at 600 a minute. Past a limit a route answers 429 problem+json rate_limited with Retry-After before the route does any work (on the API after the guard, on forms before the body is read), logs one [Limits] line and counts coupons_rate_limited_total{limit,window}.OpenVibers · 28 Sept 2026
64835d2 -
Staff powers from the contracts staff map (WS-D, ADR-022; Contracts 0.38.0): Coupons staff are staff.editorial.manage (admin, as before) or COUPONS_STAFF_SUBJECTS (the product's own, break-glass), not a role comparison. test/staff-map.test.js fails on raw role checksOpenVibers · 24 Sept 2026
74c4a1f -
OpenVibe.Coupons service (Wave 18): merchants and normalized domains (bundled public-suffix subset, subdomain and path rules), codes with restrictions, honest expiry and evidence, status unknown|reported_working|reported_failed|expired|disabled from deduplicated, rate-limited people's reports only (documented confidence formula with recency decay), public lookup API with extension CORS and per-caller limits, revocable cpx_ extension install tokens, SSR pages useful without JavaScript, feeds, sitemaps, Sources import with holds, events and Search documents through the SDK outbox; README, STATUS alpha W18, .env.example, deploy (systemd, nginx on 4850), CI, capability and service manifest proposalsOpenVibers · 23 Sept 2026
83dd07d