import type { MigratableKind } from "./registry.js";
/** Mirror of `migrations/strip-pipeline.ts` `RunOpts`. Kept in lock-step. */
export interface RunOpts {
    dataDir: string;
    dryRun?: boolean;
}
/** Mirror of `migrations/strip-pipeline.ts` `RunReport`. Kept in lock-step. */
export interface RunReport {
    scanned: number;
    wouldStrip: number;
    stripped: number;
    backups: string[];
}
/**
 * A read-time doc normalizer collected into the registry. Distinct from a
 * chained {@link Migration} (which bumps `schemaVersion`): normalizers run on
 * every read, are idempotent, and do NOT advance the version. They are the
 * "give #57 a hook, don't fix it" path — addressable by id, behaviour frozen.
 */
export interface DocNormalizer {
    kind: MigratableKind;
    id: string;
    /** Pure doc→doc transform; must be idempotent and side-effect-free. */
    apply: (doc: unknown) => unknown;
}
/**
 * A batch (disk-scanning) migration collected into the registry catalogue.
 * Unlike doc normalizers it operates on a whole data directory and mutates
 * files in place (backing them up first). It is intentionally NOT part of the
 * `migrate()` chain — it is run by an operator/CLI, not at read time.
 */
export interface BatchMigration {
    id: string;
    /** Delegates verbatim to the original standalone script's `run`. */
    run: (opts: RunOpts) => Promise<RunReport>;
}
export declare const COMPOSITION_NORMALIZERS: readonly DocNormalizer[];
export declare const BATCH_MIGRATIONS: readonly BatchMigration[];
/**
 * Apply every collected read-time normalizer for `kind` to `doc`, in
 * registration order. This is the single funnel the read paths can call so a
 * future second normalizer is picked up everywhere at once (today there is one:
 * `legacy-track-ids`). Pure: returns a new doc, never mutates, never IO.
 *
 * NOTE: this is deliberately separate from `migrate()` (the version chain).
 * Normalizers are version-independent read-time fixups; `migrate()` is the
 * version-stamped forward chain. v0.1.1 wires the catalogue; threading this
 * funnel into the actual read paths (replacing the bare `migrateLegacyTrackIds`
 * call) is a follow-up so #57's call sites stay byte-identical for now.
 */
export declare function applyNormalizers(kind: MigratableKind, doc: unknown): unknown;
//# sourceMappingURL=members.d.ts.map