/**
 * Aggregates {@link MasteryEvaluator} instances and exposes a single
 * `evaluate(decisionPoint, ...)` entry point that composes all evaluators
 * for that point multiplicatively.
 *
 * Identity behaviour: with zero evaluators registered, every query returns
 * `1.0`, leaving the base controller behaviour untouched. This is the
 * default state — mastery is opt-in.
 *
 * Composition: contributions multiply, NOT sum. So a +10% and a +5% give
 * +15.5% (1.10 × 1.05 = 1.155). And a +10% with a −5% gives +4.5% (1.10
 * × 0.95 = 1.045). Mistiming partially offsets bonuses from other
 * evaluators — exactly what we want for honest "your timing matters
 * everywhere" feel.
 *
 * @author Alex Goldring
 * @copyright Company Named Limited (c) 2026
 */
export class MasterySet {
    /**
     * Registered evaluators, in insertion order.
     * @type {MasteryEvaluator[]}
     */
    evaluators: MasteryEvaluator[];
    /**
     * Telemetry EMA. The controller doesn't consume it; downstream
     * systems read it for player-facing mastery feedback.
     * @type {MasteryScore}
     */
    score: MasteryScore;
    /**
     * Add an evaluator. Order does not affect the final result
     * (multiplication is commutative).
     * @param {MasteryEvaluator} evaluator
     */
    add(evaluator: MasteryEvaluator): void;
    /**
     * Remove an evaluator if present.
     * @param {MasteryEvaluator} evaluator
     */
    remove(evaluator: MasteryEvaluator): void;
    /**
     * Compose all registered evaluators against `decisionPoint`. Each
     * evaluator's contribution is recorded into the score for telemetry,
     * then multiplied into the running product.
     *
     * @param {number} decisionPoint
     * @param {*} controller
     * @param {*} runtime
     * @returns {number} composed multiplier; 1.0 if no evaluators care
     */
    evaluate(decisionPoint: number, controller: any, runtime: any): number;
    /**
     * Advance the score's time-based decay. Call once per fixed step.
     * @param {number} dt
     */
    tick(dt: number): void;
}
import { MasteryScore } from "./MasteryScore.js";
//# sourceMappingURL=MasterySet.d.ts.map