marque-rules — trait definitions for the marque rule system.
This crate defines the contract every rule crate must satisfy.
It has no rule implementations — those live in marque-capco and future crates.
The engine depends only on this crate, enabling rule crates to be swapped.
Type split: FixProposal vs AppliedFix
FixProposal is pure data emitted by rules — deterministic, timestamp-free,
classifier-free. AppliedFix wraps a proposal with runtime context (timestamp,
classifier id, dry-run flag) and is constructed only by Engine::fix.
This makes "suggested vs applied" a type-system invariant.