Skip to main content

Worked example — active re-consent

A material change to the core of the contract still requires active agreement, with the full grace period and a hard gate at the deadline:

php artisan legal-consent:publish terms de --active \
--announce-at=2026-07-01 --enforce-at=2026-09-01

Both dates are validated

You cannot smuggle a short lead by omitting --announce-at, and the minimum period is per regime (§ 675g's two months is hard).

Since 0.19.0 the order itself is checked as well, before any mode or regime rule runs: an --announce-at that falls after --enforce-at is refused rather than frozen. A change cannot take effect before it was announced, and the stored notice_period_days can no longer be negative.

An --enforce-at in the past with no --announce-at is unaffected — that is the documented immediate gate, and it now freezes a period of 0 rather than a negative number.

Use a future --enforce-at: the lead-time guard only runs while the effective date is still ahead, so an already-past date publishes an immediate gate with no grace. The dates above are illustrative — pick your own.

What happens at the deadline

From enforce_from, the middleware blocks the subject until they re-accept the new major version.

A SHA-256 hash detects any text change; a human classifies it (the notice mode) at publish time; the gate compares major_version only.

Which subjects the gate blocks at all is configurable — see gate.subject_filter in the configuration reference — and the route it redirects to is routes.consent_name.