---
url: https://docs.nemo12.com/ops/quality-observability.md
description: >-
  Five parts that catch regressions before and after deploy: Sentry, Context7,
  selective E2E, synthetic production checks, real-user web vitals.
---

# Quality and observability (SRC-1397)

Source: owner chat 14.10.2026 (SRC-1397). Goal: find a broken page or API before a parent does, and
spend fewer CI minutes doing it.

## The five parts

| Part | What it does | Doc | Status |
|---|---|---|---|
| Sentry | Error and exception reporting for the web apps and workers, with a release tag per deploy | [sentry.md](sentry.md) | Done in code, needs owner account and secrets |
| Context7 | Current library docs for every Claude session via MCP, so code matches the pinned version, not model memory | this page and `.claude/rules/library-docs.md` | Done: `.mcp.json` entry and rule |
| Selective E2E | Run only the Playwright specs a change affects on PRs (import graph aware); full suite on `nightly/*` PRs and on `main` unless the PR already ran it on the same tree | [e2e-select.md](./e2e-select.md) | Done |
| Synthetic checks | Scheduled probes of key production URLs and API endpoints, after deploy and on a timer | [synthetic-checks.md](synthetic-checks.md) | Done in code, version checks need two owner tokens |
| RUM | Real-user Core Web Vitals (LCP, INP, CLS) via `web-vitals`, written to Workers Analytics Engine | [rum.md](rum.md) | Done in code, needs Analytics Engine token |

## Context7

`.mcp.json` at the repo root declares the remote MCP server `context7`
(`https://mcp.context7.com/mcp`), so every Claude Code session on this repo, local or cloud, gets it.
No key is committed: the header reads the environment variable `CONTEXT7_API_KEY`, and the server
works without a key at a lower rate limit. The rule `.claude/rules/library-docs.md` tells sessions to
query it before using or upgrading motion, shadcn/Radix, Tailwind v4, Remotion, HyperFrames, wrangler,
`@sentry/*`, `web-vitals`, Playwright or vitest.

## Owner setup checklist

* \[ ] Create a free Sentry account and one project; turn on **Prevent Storing of IP Addresses** and
  **Data Scrubber** in its Security & Privacy settings; then add GitHub secrets `SENTRY_DSN`,
  `VITE_SENTRY_DSN`, `SENTRY_AUTH_TOKEN`, `SENTRY_ORG` and `SENTRY_PROJECT` (details in [sentry.md](sentry.md)).
* \[ ] Create a Cloudflare API token with Account Analytics read access for Workers Analytics Engine
  queries; set it as the Worker secret `RUM_SQL_TOKEN` on `nemo12-api` (details in [rum.md](rum.md)).
* \[ ] For the deployed-version checks, set two `nemo12-api` secrets: `SYNTHETIC_CF_TOKEN` (Cloudflare,
  Workers Scripts Read) and `SYNTHETIC_GITHUB_TOKEN` (fine-grained, Contents Read on this repo); details in
  [synthetic-checks.md](synthetic-checks.md). The GitHub token expires: note its renewal date.
* \[ ] Optional: get a Context7 API key and export `CONTEXT7_API_KEY` in your shell or cloud
  environment for a higher rate limit.
