Pass-3 enforcement: evaluate personalization rules against a ClientContext and strip forbidden activities from a compiled WPL plan.
Ported from wpl-validator-ts/src/enforce/index.ts. Pure function, no
process state. Maps are immutable in Elixir so "deep clone" is structural
copy via Jason.decode!(Jason.encode!(plan_json)) for round-trip purity,
matching the TS JSON.parse(JSON.stringify(...)) behavior.
Summary
Functions
Evaluate rules against ctx and strip forbidden activities from plan_json.
Types
Functions
@spec enforce(map(), client_context(), [rule()], enforce_opts()) :: enforcement_result()
Evaluate rules against ctx and strip forbidden activities from plan_json.
Returns %{plan, evaluated_rules, stripped, diagnostics}.
Options:
:plan_start_date— ISO date string of plan day 1 (required for cycle_day-conditioned rules).