Run it
You'll end with a scheduled job that keeps each customer's model honest: outcomes reported as they arrive, the model refitted on new data, and a drift check deciding whether to keep, replace or retire it. The fitting and scoring themselves are in Ship a product.
The weekly loop
Score, report, refit, check drift, and act on what it says; then again next week.
Score each day's new cases from the model you trust: a question with
model_ref, no fit (Score from the model).Report outcomes as you learn them, with an
event_idon each so a retry is safe:{"model_ref": "mr1_…", "outcomes": [{"entity_id": "deal_0412", "outcome": 1, "observed_at": "2026-09-30", "event_id": "deal_0412:won"}]}Outcomes are evidence about the model's track record; they do not change the model or any answer.
Refit on a schedule (weekly or monthly, when the record has new outcomes): ask with the new record and
refit_of: "<the model_ref you are using>".Read
dg_driftfor the new model and act on it:
recommendation |
Do |
|---|---|
keep |
dg_extend_model on the model you use, and carry on |
refit |
switch to the new model_ref |
abandon |
stop asking this question; the pattern no longer holds |
no_check_yet |
nothing has been compared; refit first, and never renew on it |
A single refusal on a refresh is not drift. More: Watching for drift.
Lifetimes
A model answers until model_expires_at (90 days by default, 1 to 365 with model_ttl_days on the
ask that fits it). The lifetime is a privacy limit and a safety net; drift decides whether a model
is good. Set it longer than your refit cycle. Details: Model lifetime.
A customer leaves
dg_delete_model removes the model and its outcome record at once. It needs the "Can report
outcomes" capability, because it ends the outcome record too.
What to watch
| Signal | Where | Worry when |
|---|---|---|
| refusals on refits | the refit's answer state |
a question that answered starts refusing every time |
model_expires_at |
every answer | it is closer than your next refit |
row_not_scoreable |
the daily job | your data stopped sending a column in model_columns |
dg_evidence |
Prove it | acting stops helping |
The agent skill for this page: datagoat-product.
Next
Show that the calls were right: Prove it.