Which timestamp the cadence trigger measures staleness against:
lastScored — the binding's LastScoredAt (how long since we last scored)lastTrained — the model's TrainedAt (how long since the model itself was built)
Defaults to lastTrained (the model going stale is what drives retraining).Cadence: a model is stale when its reference timestamp (last scored / last
trained — see cadenceAnchor) is older than this many days. 0 or a
negative value disables the cadence trigger.
Which holdout metric to compare challenger-vs-incumbent on (a key inside the
model's HoldoutMetrics JSON). 'auto' picks a sensible default per problem
type (roc_auc for classification, r2 for regression), falling back to the
first numeric metric present on both. Higher-is-better is assumed for the
built-in metrics.
Data-volume: a model is stale when the target entity's CURRENT row count has
grown by more than this fraction over the count at training time
((current - trained) / trained > threshold). e.g. 0.25 = "stale once 25%
more rows exist than the model was trained on". 0 or negative disables it.
Drift: whether to consult the injected IDriftDetector. When true and
the detector reports drift over its own threshold, the model is stale.
Promotion margin: a freshly-retrained challenger is only RECOMMENDED for
promotion when its holdout metric beats the incumbent's by at least this
absolute margin (e.g. 0.01 = "must be ≥1 point better"). Below the margin →
HOLD. Never auto-promotes regardless (promotion is a separate signed-off
Action / human gate — §6.4 / PS-AGENT-7).
Configurable retraining/staleness policy (plan §12). All thresholds carry sensible defaults via DEFAULT_RETRAINING_POLICY so a caller can opt into just the knobs it cares about. The same policy drives staleness detection AND the retraining-trigger decision (a model is "stale" → it is a retraining candidate).