The change model

Every change gets an agent.
You define the goal and the guardrails.

A change is the fundamental unit of product work — introducing something new, or modifying something that exists. Both are a change. Traffical moves each one from idea to default through the same governed, measured lifecycle — and an agent can drive it, because the goal and the limits were set before it started.

Built on the parameters, layers, and policies in how it works. A change adds intent, approval, and retained learning on top — and it's a layer you can add when you want it, not a prerequisite.

7 steps · two are one-time setup0 code changes per change after that
01
Parameterize

Turn the values you keep redeploying into parameters

One-time setup, per codebase

Install the SDK, then name the values you want to control. That's the integration.

Anywhere your product has a hardcoded number, string, or flag that a person might reasonably want to change — a discount, a headline, a ranking weight, a model temperature, a threshold — you replace it with a named parameter read through the SDK, with the current value as its default.

You do this once. From then on, that value is controllable from the dashboard, and every change to it can be staged, measured, and governed without touching the codebase again.

Type-safe SDKs, one shared conformance spec
React Next.js Svelte Node Python React Native TypeScript PHP Swift / iOS + OpenFeature

A given user buckets identically on every platform, so web, app, and backend agree on what that user sees.

Before
checkout.ts
// redeploy to change
const discount = 10;

applyDiscount(discount);
After
checkout.ts
// controllable, default kept
const { discount } = traffical.getParams({
  context: { userId: user.id },
  defaults: { discount: 10 },
});

applyDiscount(discount);

Your default is the floor

If nothing is running, if the config hasn't loaded, if Traffical is unreachable — the SDK returns the default you wrote in code. Nothing can break by being absent.

02
Centralize

Change the value once — every surface follows

The payoff of a central parameter: web, app, backend, and email can't drift apart.

a

One value, four consumers

The shape of the problem a central parameter removes.

Most teams have the same discount logic in four places: the storefront, the mobile app, the pricing service, and the win-back email. Changing "10%" means four tickets, four deploys, and a window where they disagree.

One parameter, consumed everywhere, removes that class of problem. The value resolves from a single source, so a change lands everywhere at once — or nowhere. There is no partial state to reconcile.

  • No drift — the same user sees a consistent value across every surface and session.
  • No coordination — front-end and back-end teams don't need to ship together.
  • One place to look — what is this value right now, and who last changed it?
pricing.discount_pct 15
Storefront
web · SSR
Mobile app
iOS · Android
Pricing service
backend
Win-back email
CRM
One value · four consumers · resolved identically, in-process
b

Read natively on every platform

Each SDK resolves the same key in-process, with a compiled fallback.

The same parameter key, read natively on every platform that touches the experience. No shared client library to write, no config file to keep in sync, no per-surface reimplementation of who-gets-what.

Storefront · React
Checkout.tsx
const { discount } = useParams({
  defaults: { discount: 10 },
});
Pricing service · Python
pricing.py
params = traffical.get_params(
  context={"user_id": uid},
  defaults={"discount": 10},
)
Mobile · Swift
Checkout.swift
let discount = traffical.number(
  "pricing.discount_pct",
  default: 10
)
Same key · same bucketing · one conformance spec across all SDKs
c

Bound to the surfaces that consume it

What the value does on each surface is what makes a change classifiable.

A surface is a place your product meets a user — checkout, a mobile screen, a ranking service, an email. Parameters are bound to the surfaces that consume them, and each binding records what the value actually does there.

That binding is not documentation. It's what lets Traffical compute how risky a change is before it runs: a value that merely renders is safer than one that drives a decision or writes to a system of record.

Surfaces drive the risk class in step 3
Surfaces consuming pricing.discount_pct
SurfaceKindRole
Checkoutfrontendrender
Mobile appfrontendrender
Pricing servicebackenddecision
Win-back emailemailrender
d

One page per parameter

The current value, who is overriding it, and in what order it resolves.

Every parameter has its own page: what type it is, what the default is, which surfaces consume it, and which policies are currently overriding it. It's the answer to "what is this value right now, and why?"

Values resolve in a fixed order, so the outcome is always explainable — a base default, an optional per-environment override, and the highest-priority policy override on top.

Resolution order
1 Base default 10 — from your code
2 Environment override staging only
3 Policy override · highest 15
The Holdout / Parameters / pricing.discount_pct number
pricing.discount_pct
Discount percentage applied to all products (0–50)
Default value
read-only · synced from config.yaml
10
Consumed on
Checkout · Mobile · Pricing service · Email
4 surfaces
high-value-cart adaptive
overriding · in optimization-discounts
running
discount-optimization experiment
overriding · in optimization-discounts
running
03
Certify

Agree what counts as better — once, for everyone

One-time setup, per organisation

This is where the goal and the guardrails come from — not from whoever opened the change.

A certified metric is one approved definition, versioned and validated, that the whole organisation shares. One meaning of "margin", one meaning of "active user" — not seventy team-specific variants that quietly disagree. Your data team owns certification; a change can only reference definitions that already carry it.

A protocol bundles those metrics into a reusable measurement template the platform knows how to run: what the objective is, which secondary metrics to watch, which guardrails apply with what thresholds, and which diagnostics catch instrumentation drift. Protocols are how the design of a sound experiment stops being something anyone has to reinvent.

When a change is created it resolves its measurement plan from the protocols that match its surfaces, and snapshots that plan. Change the protocol next month and the running change keeps the version it started on — so an old decision stays reconstructable.

  • Versioned — a certified definition has a history, and so does every threshold on it.
  • Reusable — certify once, and every change on that surface inherits it.
  • Snapshotted — the plan a change ran against is frozen at start.

No certified protocol, no traffic

If nothing certified covers the change, it can be drafted but not started — until a person approves its metrics and guardrails explicitly. This is the line an agent cannot cross, because inventing the yardstick is not one of its permissions.

The Holdout / Protocols / checkout-commercial certified · v3
Checkout Commercial Protocol
Certified by Ana Ruiz · data · May 20, 2026
objective 1 primary · 2 secondary
revenue_per_session primary
ratio metric · maximise
certified v4
add_to_cart_rate secondary
conversion rate · watch
certified v2
average_order_value secondary
ratio metric · watch
certified v2
guardrails 3 · 2 blocking Breach pauses the phase automatically
refund_rate
must not increase > 0.5%
blocking
checkout_error_rate
must not increase > 1%
blocking
margin
must not decrease > 2%
warning

Every change on the Checkout surface resolves this protocol — so the bar is the same one, every time, whoever opened it.

04
Define the change

A change is a set of parameter values plus a plan to prove them

New feature or a tweak to an existing one — both are a change. Same lifecycle.

You state the intent — what this is for — and pick the parameters involved. Then you define the variants: each variant is simply a named set of values for those parameters. A control variant is the current default, so you're always comparing against the real status quo.

Traffical computes a risk class from the surfaces those parameters touch and recommends a lifecycle template — the sequence of phases the change will move through. Rollout is one of those phases, not the whole story.

Variants are parameter value sets
Variantdiscount_pctfree_shipping
control10false
generous15false
bundled10true

One change can move several parameters together — that's how you test a coherent experience rather than an isolated toggle.

The Holdout / Changes / new
Intent
Parameters
3 Strategy
4 Variants
5 Measurement
6 Phase plan

Strategy

Based on the surfaces your parameters touch, we computed a risk class and recommend a lifecycle. Adjust either before continuing.

Risk class medium backend surface · decision binding
Lifecycle template
Gradual rollout
Ship in stages with health checks. No experiment.
Canary → Experiment → Rollout
Validate safety, measure impact, then ramp the winner.
Adaptive optimization
Let the system keep optimizing within guardrails.
No certified protocol matches — a human must approve metrics & guardrails before traffic. You can still create a draft.
05
Run the phases

Exposure grows only as the evidence allows

Rollout is a phase inside the change — not a separate tool, not a separate process.

optimize-checkout-discount experiment · day 3 of ~6
Setup
Canary
Experiment
Rollout
Complete

Each phase answers one question before the next begins. The canary asks is this safe? on a 1% slice. The experiment asks is it better? against a real control. The rollout asks does it hold? as exposure ramps in health-gated steps. Complete promotes the winning values into the parameter defaults.

Users aren't re-randomized between phases — a user in the treatment arm during the canary stays there through the experiment, so no cohort is contaminated.

Guardrails are attached per phase with thresholds agreed up front. A blocking breach pauses the phase automatically and users fall straight through to the defaults. Nobody has to be watching a dashboard at 3am.

Who advances each phase is your setting, not ours
Guardrails on this phase
refund_rate
must not increase > 0.5% vs baseline
blocking
checkout_error_rate
must not increase > 1% vs baseline
blocking
margin
must not decrease > 2% vs baseline
warning

On a blocking breach

The phase pauses, exposure drops to zero, and a decision record is written with the evidence that triggered it. Default response is pause; revert is one click.

Across every step

You decide how much of this runs itself

Autonomy is a setting, not a property of the product. It starts at zero.

Nothing in the model requires you to hand anything over. On day one every action is a proposal that waits for a person, and the platform's value is that the proposal arrives complete — intent, measurement plan, guardrails, and current evidence already assembled.

From there you move the dial, per risk class, at whatever pace earns your trust. Teams typically let low-risk render-only changes start themselves within weeks, and keep a person on anything that touches pricing or a system of record indefinitely.

The dial only ever governs who may act without asking. It never changes what the rules are, and it never applies to promoting a change into your product defaults.

Autonomy settingper risk class
0
Manual
Every action waits for a person. Agents may draft and analyse, nothing else. The default for a new workspace.
current
1
Propose only
Agents open changes and recommend the next move with evidence attached. A person clicks approve.
2
Semi-automatic
Phases advance on their own while the evidence is clean. Anything ambiguous, close, or breaching stops and waits.
3
Unattended within guardrails
The full loop runs for a chosen risk class. Guardrail breaches still pause automatically; promotion still needs sign-off.
Reversible at any time · set per risk class, not per agent
Your role at every stage
StageWho may actWho must approveAt setting 3
Parameterizeengineeringhumanunchanged
Certify metrics & protocolsdata / analyticshuman, alwaysunchanged
Set guardrail thresholdsproduct + datahuman, alwaysunchanged
Define a changeagent or humanhumanagent may start it
Start trafficagent or humanhuman below risk capagent, within cap
Advance a phaseagent or humanevidence gateagent, if clean
Pause or revertautomaticnone — it just stopsunchanged
Promote to defaulthuman, alwaysstill human

Read the last column first. Even at maximum autonomy, four things never move: what counts as better, what counts as unacceptable, which protocols are valid, and what becomes your product's default.

What no setting can automate
Metric definitions
A metric is certified by a person, or it cannot be a primary.
never
Protocols
Reusable measurement templates are certified, then versioned.
never
Guardrail thresholds
The line an agent must not cross is drawn by your team.
never
Promotion to default
Changing what your product ships by default needs a signature.
never
Raising the autonomy setting
The dial cannot move itself. Only an admin moves it.
never
One record, whoever acted
Audit record / optimize-checkout-discount
09:02 · agent agent
opened change · 2 params · plan v3 · approved by m. toben
09:18 · human human
approved plan · started canary · risk: medium · m. toben
11:40 · agent agent
advanced · canary → experiment · 4/4 clean · setting 2
02:14 · system automatic
paused · refund_rate breach · +0.7% → stop
09:31 · human human
resumed · threshold reviewed · note attached · a. ruiz

Agents, people and automatic responses write to the same log with the same fields — so "who did what, when, and against which thresholds" is one question with one answer, not two systems to reconcile.

06
Measure

Results you'd put in front of your data team

A verdict for the review, with the per-variant detail your data team needs.

Layers / experiments-catalog / catalog-layout-test running · day 3 of ~6
Keep running — not enough evidence yet
Leading variant is up 1.9%, but the interval still crosses zero. Verdict expected in ~3 days.
leading variant
+1.9%
spacious, on add_to_cart conversion
measurement progress
58%
of the sample needed for a verdict
guardrails
1 / 1
purchase conversion within threshold
add_to_cart conversion primary
spacious +1.9% [−6.9, +10.8] · normal −0.1% [−8.8, +8.7]
anytime-valid
purchase conversion guardrail
within threshold on both variants
passing
07
Learn

What you find out stays found out

A closed change is a record, not a closed ticket.

When a change completes, the outcome doesn't evaporate into a closed ticket. The question, the variants, the evidence, the verdict and the reasoning are kept together as a durable record — searchable by parameter, surface, or metric.

So the next time someone proposes a more aggressive discount, the answer to "did we try this?" takes ten seconds instead of a week of archaeology. New team members inherit the institutional memory instead of rediscovering it, and the next iteration starts from what you already know rather than from zero.

The audit record is the proof underneath it: every start, advance, promotion, pause, and revert, with who acted, what the evidence said, and which thresholds were in force at the time. Versioned and snapshotted, so a decision three weeks old can still be reconstructed exactly.

Accumulated learnings · pricing
Does a deeper checkout discount pay for itself?
15% beat 10% on revenue per session by 4.2%, margin held. 25% won conversion but lost margin — rejected.
3 changes
shipped 15%
May 2026
Is a shorter onboarding better?
5 steps beat 7 on activation by 6.8%. Going to 3 steps regressed — the floor is 5.
2 changes
shipped 5 steps
Apr 2026
Does urgency copy in cart help?
"High" urgency raised add-to-cart but increased refunds past the guardrail. Auto-reverted. Do not retry without a refund-rate plan.
1 change
reverted
Mar 2026
Feeds the next iteration

Prior results are context for the next proposal — human or agent — so iteration compounds instead of looping.

Input: what worked, and where
Survives turnover

The reasoning stays attached to the change, not to the person who happened to run it.

Proof: full audit trail
Agent-ready by design

The same rules hold when an agent is driving

Stated intent, an approved plan, guardrails on every phase, a record at the end.

Your team already ships with AI assistance. Traffical is built so that work arrives through the same front door as everything else — stated intent, an approved measurement plan, guardrails on every phase, and a decision record at the end.

Structured, not freeform

An agent fills in a change the same way a person does. There's no side channel into production.

Same schema

Guardrails aren't optional

Thresholds are set by your team, in advance. An agent can't widen them or measure against something else.

Your thresholds

Defaults still need a person

Making a value the permanent product default is always a human approval. Always.

Human checkpoint

Reads what came before

Accumulated results are context, so an agent proposes the next experiment rather than repeating an old one.

Learns from history

Where this goes

Governance is what makes autonomy affordable

Each rung needs the one below it to already be true.

The reason to build the change model now isn't paperwork. It's that every step toward a product that improves itself needs the same four things to exist as data rather than as a slide: what we're trying to achieve, how we'd know if it worked, what must not break, and what we already learned. Protocols, objectives, guardrails, and the decision log are exactly those four — which is why the governance layer is the thing that unlocks autonomy rather than the thing that slows it down.

more human judgment more machine autonomy
Rung 01
Assisted

Agents draft the code and scaffold the change. A person drives every transition and writes the readout. This is where most teams are today.

human decides: everything
Rung 02 · today
Proposed

Agents and monitors propose transitions, with the evidence they decided on bound to the proposal. A person reviews and approves. Safety actions already run unattended.

human decides: each transition
Rung 03 · next
Supervised

Low-risk changes advance themselves inside certified protocols, and guardrail breaches self-contain. People hold promotion, exceptions, and anything above the risk line they set.

human decides: promotion + exceptions
Rung 04 · the direction
Self-improving

The product continuously proposes, validates, and retires its own changes against objectives you set — compounding on its own decision log. People own the objectives, the guardrails, and what "better" means.

human decides: objectives + what good means

You pick the rung per risk class, not per company. Copy on a marketing page can sit at rung four while pricing stays at rung two — the same organization, two different autonomy settings, both fully audited.

And because the ladder is configuration rather than architecture, moving up isn't a migration. It's widening what the same gates already permit. Nothing about rung four changes the fact that a human certified the metric and set the threshold.

What never moves up the ladder
The definition of success and the limits on harm
human
Certifying metrics
What counts as a conversion, a refund, a regression
human
Setting guardrail thresholds
How much harm is too much
human
Choosing the objective
What the product is optimizing for at all
human
Everything else
Scaffolding, running, monitoring, containing, reporting
delegable

Build the guardrails before you need the speed

Parameterize a single value this week. The governance you add around it is what lets you hand more of it over later.