v3/docs/adr/ADR-310-funnel-rollout-measurement-emergency-controls.md
ADR-305 defines gates and two measurement planes; nothing defines how the funnel actually reaches the install base, in what order, with what promotion criteria, or how it is rolled back. Shipping all surfaces to 100% of installs at once maximizes exactly the failure mode the whole set guards against: trust damage at fleet scale before guardrail data exists.
Cohort assignment for percentage phases is a deterministic local hash of the funnel ID into buckets — decided client-side, no network call, stable across sessions, re-rolled if the ID rotates.
| Phase | Population | Surfaces active |
|---|---|---|
| 0 | CI and maintainer dogfood only | All, behind explicit env flag |
| 1 | New installs only | Disclosure + educational content only |
| 2 | 5% of upgraded installs | Same; disclosure required before anything renders |
| 3 | 25% of upgraded installs | Same; monitor disable and issue rates |
| 4 | 100% | Educational surface |
| 5 | 100% | Introduce promotional content, capped at the 1-in-5 ratio (ADR-301) |
| 6 | 100% | Credit-exhaustion recovery (ADR-303) + proxy activation (ADR-304/307) |
Phase-0 exit criteria additionally include: ADR-309 legal review complete (LIA, privacy notice, regional storage) and the acceptance test below green on all platforms.
A failed criterion holds the phase; two consecutive failed evaluation windows roll back one phase.
@claude-flow/cli → claude-flow → ruflo, with all dist-tags updated and verified per the repo's publishing rules.Operationalizes the ADR-305 kill-switch model:
GET /v1/funnel-policy fetch (ADR-308). Consumer default off; enterprise managed deployments may enable a 6-hour polling interval. Never carries executable code — schema-validated policy data only.RUFLO_FUNNEL=0, enterprise managed policy, or user config.CI benchmark on every funnel-touching release:
Test matrix: {funnel on, off} × {new install, upgraded install} × {Linux, macOS, Windows} × {interactive TTY, pipe} × {standard, screen-reader/reduced-motion} × {online, offline}.
Hard gates (release-blocking):
| Gate | Threshold |
|---|---|
| Startup p95 regression | < 10 ms |
| Memory regression | < 5 MB |
| Command failure delta | 0 |
| Unexpected network calls | 0 |
| Promo output in CI or non-TTY | 0 |
| Promotional display before disclosure on upgraded install | 0 |
Disclosure acceptance, disable rate, signup initiation, account completion, proxy activation, 7-day and 30-day retention, paid conversion — per the ADR-305/309 event schema and consent rules. These metrics never override release safety gates.
Take an existing offline installation, upgrade it, and run the CLI in TTY, non-TTY, CI, screen-reader/reduced-motion, and enterprise-disabled configurations. Prove that:
RUFLO_FUNNEL=0 suppresses every funnel surface (ADR-301, 302, 303).