The Test loop
A committed Test freezes its question and the evidence it was decided on. Observations are appended, a Conclusion is final, and a changed mind is a new Test.
Win & Scale recomputes Next tests on every read, so their ids and numbers drift with the window. Without a record, a rejected idea comes back next week as a fresh recommendation. A Test is the record: a Next test the operator committed to, with its question frozen.
The loop
Find a Next test
meta_get_history_winners returns nextTests, ranked. An Iteration keeps a
winner and changes exactly one Dimension's Value. An Exploration tries a Value,
or a combination of Values, the account has not tested enough to judge. Each carries
its computed evidence, its basis (account, customers or competitors), its limits
(what could make the evidence mislead), reverseIf (what would reverse it) and
prior (concluded Tests on the same lesson).
Brief it
A brief is a Next test written up for production: the idea, why, what to make,
the openers. It quotes only numbers its evidence carries and is refused otherwise.
Briefs are saved with meta_save_briefs for a Next test, or meta_save_brief for one
brief on the board. See POST /api/v1/briefs.
Commit
POST /api/v1/tests (meta_create_test) freezes the
intent: hypothesis, reference, what stays and what changes, the funnel and goal,
and the rule that will judge it. It also snapshots the evidence the decision was
based on. Creating a Test never calls Meta and spends nothing.
You commit either a Next test (pass its nextTestId with the same window and
funnel it was computed in) or a custom idea with its title, hypothesis and the
evidence it rests on.
Make and launch
Win & Scale does not make images or video. The creative is produced outside it. Once
you have the files, launch them with the Test's testId and the brief's briefId.
The ads are created paused, as always. meta_link_test_artifacts attaches
uploads, ads or launches made elsewhere, such as in Ads Manager. A link moves a Test
from planned to producing (an upload) or to live (an ad or launch).
Observe
After delivery, POST /api/v1/tests/{testId}/observations
reads the outcome now and appends it as an Observation: supported, rejected,
inconclusive or invalid, with the numbers and the reasons.
Conclude
POST /api/v1/tests/{testId}/conclusion records the
Conclusion, once, with a note on what it means for the next creative. It is final.
The lesson then appears on every matching Next test.
What is frozen, and what is appended
| Part | Rule |
|---|---|
| Intent: hypothesis, reference, keep and change, funnel, goal, markets, the judging rule, the evidence snapshot | Frozen when the Test is created. A database trigger refuses an update. |
| Observations | Append-only rows. |
| Conclusion | One per Test, final. A second is refused. |
| A changed mind | A new Test with supersedesId pointing at the old one. Never an edit. |
| Abandoning | meta_abandon_test stops a Test with no Conclusion. It keeps its intent, links and Observations, and teaches nothing. |
The trigger exists because MCP and REST write with a service client, and row-level security would not stop a buggy tool from editing a frozen row.
The rule is declared before the result
A Test declares its comparator, the expected volume it needs before it can be judged, how long it waits for late conversions, and how long it runs. That makes low delivery read as inconclusive by construction.
An Observation is evaluated in this order:
- Nothing linked or delivered: inconclusive.
- Reference ads overlapping the Test's own ads: invalid.
- Younger than the maturity wait: inconclusive.
- Spend that expects fewer goals than the declared volume: inconclusive.
- Otherwise the same rule as history verdicts: supported or rejected only when clearly above or below what the spend should have bought, else inconclusive.
The window opens on first delivery, so a later read never moves the goalposts. The
default comparator, baseline, holds the Test to the cost per goal the decision was
made on. reference races the Test against the reference creative's ads over the
same days, and only works if both run.
meta_conclude_test refuses supported or rejected when it contradicts the latest
Observation, unless the human gives an overrideReason, which is kept in the note.
Lessons come back
Each Test has a lesson key that names the lesson, not the winner it was proposed on.
Concluded Tests, failures included, come back as prior on every Next test asking the
same question. A rejected lesson in the same funnel and market sinks to the end of its
kind. It is still shown, with its history.
Every Observation is observational. Meta did not randomise who saw each ad, so a Test is not an A/B experiment, and a supported Conclusion means the pattern held in this account, not that the Value caused it.
Where to find it
GET /api/v1/testsandGET /api/v1/tests/{testId}- MCP:
meta_list_tests,meta_get_test,meta_create_test,meta_link_test_artifacts,meta_observe_test,meta_conclude_test,meta_abandon_test - The guide: Brief and test