Production-impacting changes require a second reviewer.
Approval is a flow, not a checkbox. Requested → assigned → approved → applied. Each step writes an audit row.
Every flag, every rule, every audit row is tenant-scoped at the storage layer. Bypass is impossible — not because the SDK asks nicely, but because the row can't be written without one.
MVP runs on Firebase. A custom data plane is a post-PMF decision, not day one.
TypeScript first today. A Web SDK is on the v1 roadmap; edge resolution lands in v1.5. The evaluation API requires a tenant — enforced server-side, not optional.
// scoped, deterministic, reversible const flag = await argus.evaluate({ key: "new_billing_v2", tenant: ctx.tenantId, // required env: "prod", }); if (flag.on) renderNewBilling(); // → audit row written, scoped to tenant. // → reversible from the dashboard in one click. // → impossible to evaluate without a tenant.
Tenant override documents are first-class — not a special case of segments. They have their own audit stream and resolution lane.
Approval is a flow, not a checkbox. Requested → assigned → approved → applied. Each step writes an audit row.
A support lead can read tenant truth without touching prod. An approver scoped to tenant B cannot approve tenant A.
Every resolution response carries the source of the value (default · rule · override · rollout). Every change writes a row you can query by tenant.
Honest comparison against the alternatives most teams already run. We update this page as the tools ship changes.