diff --git a/app/docs/deploy/feature-flags/page.mdx b/app/docs/deploy/feature-flags/page.mdx new file mode 100644 index 00000000..f0ca2dee --- /dev/null +++ b/app/docs/deploy/feature-flags/page.mdx @@ -0,0 +1,93 @@ +import { pageMeta } from "@/lib/og"; + +export const metadata = pageMeta( + "Release Features", + "Enable or roll back deployment-wide release features on the Omnigent server with the OMNIGENT_FEATURES environment variable.", + { + eyebrow: "Deploy", + path: "/docs/deploy/feature-flags", + }, +); + +# Release Features + +Release features are deployment-wide, temporary rollout switches for the +Omnigent server. They are **not** authorization controls or per-user +preferences — a feature is either on or off for the whole server. They exist so +a new surface can ship dark, be enabled on one deployment at a time, and be +rolled back without a code change. + +Every release feature is **off by default**. + +## Enabling features + +Set the comma-separated `OMNIGENT_FEATURES` environment variable and restart or +redeploy the server: + +``` +OMNIGENT_FEATURES=usage_page,harness_install +``` + +Unset or empty means every release feature is off. Unknown names **fail server +startup** rather than silently applying a typo, so a misspelled key can never +quietly change rollout behavior. + +The server resolves the enabled set **once at startup** and publishes the +frontend-visible values in `GET /v1/info` under `features`. Because the web app +caches server capabilities at page boot, users must **reload the web app** after +you change the flag set for the change to take effect. + +
+ +The former `OMNIGENT_HARNESS_INSTALL_ENABLED` switch has been removed. Setting +it to a truthy value is rejected at startup with a migration hint — use +`OMNIGENT_FEATURES=harness_install` instead. + +
+ +## Available features + +| Key | Default | Review by | Purpose | +| ----------------- | ------- | --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `usage_page` | Off | 0.11.0 | Exposes the web Usage route, sidebar navigation, cost timeline, and cost-breakdown details. The existing `GET /v1/usage` CLI API remains available while it is off. | +| `harness_install` | Off | 0.11.0 | Lets the web UI install and configure supported harnesses on a connected host. When off, the install/credential routes return 404 and the UI keeps the "run `omni setup`" hint. | + +Each flag is scheduled to be removed by its **review** release — either by making +the feature unconditional, removing it, or promoting a genuinely permanent +setting into normal server configuration. + +## Enabling per platform + +The mechanism is the same everywhere — set `OMNIGENT_FEATURES` and restart the +server process — but each deployment target exposes it differently. + +- **Docker Compose.** Set `OMNIGENT_FEATURES` in `.env`, then recreate the + server container with `docker compose up -d`. Verify with + `curl -s http://localhost:8000/v1/info | jq '.features'`. +- **Kubernetes.** Set the `OMNIGENT_FEATURES` value in `base/configmap.yaml`, + apply your Kustomize target, and restart the Deployment so every pod picks up + one fresh startup snapshot: + + ``` + kubectl kustomize deploy/kubernetes/base/ | kubectl apply -f - + kubectl rollout restart deployment/omnigent + kubectl rollout status deployment/omnigent + ``` + +- **Railway.** In the Omnigent service's **Variables** tab, set + `OMNIGENT_FEATURES` to the enabled set (for example `usage_page`). Railway + redeploys the service automatically. +- **Render.** Set the `OMNIGENT_FEATURES` environment variable on the service + (it defaults to empty in `render.yaml`), then redeploy. +- **Databricks.** Pass the comma-separated list to the deploy script's + `--features` argument (for example `--features usage_page,harness_install`), + then reload the web app after the redeploy. + +## Rolling out and back + +1. Deploy an immutable image with the feature absent from `OMNIGENT_FEATURES`. +2. Enable it on one deployment, consistently across all replicas. +3. Verify `GET /v1/info`, then reload and exercise the gated UI. +4. Expand by deployment cohort. +5. Roll back by removing the key (or emptying the variable), redeploying the + same image, and reloading the web app. diff --git a/components/DocsSidebarFull.js b/components/DocsSidebarFull.js index 6f8cd0bc..131ffd17 100644 --- a/components/DocsSidebarFull.js +++ b/components/DocsSidebarFull.js @@ -68,6 +68,7 @@ const SECTIONS = [ { href: "/docs/collaborate/auth", label: "Auth & SSO" }, { href: "/docs/deploy/database", label: "Database" }, { href: "/docs/deploy/cloud-sandbox-host", label: "Cloud Sandbox Host" }, + { href: "/docs/deploy/feature-flags", label: "Release Features" }, ], }, {