The four notice modes
A change to a legal text is not one thing. The package models the four ways a change is
communicated and enforced — NoticeMode — so a change gets exactly the notice the law
requires and never more:
| Notice mode | When to use it | The subject must… | On silence | Gates access? |
|---|---|---|---|---|
SilentEditorial (--editorial) | a typo, a clarification, a purely favorable change | nothing | bound | no |
InfoPush (--info) | a material change that is information only — a payment-contract change under § 675g, a material privacy-notice update, a reference-rate change | nothing (may object or terminate) | takes effect regardless | no |
DeemedConsent (--deemed) | a minor/peripheral contract change where silence may bind (Zustimmungsfiktion) | object before the deadline, else nothing | silence binds (§ 308 Nr. 5 BGB) | no |
ActiveReconsent (--active, or the legacy --material) | a material/core contract change, or a new/expanded real consent | actively accept before it applies | not bound; the old terms continue | yes |
How a mode reaches the subject
legal-consent:dispatch-notices routes each mode to the matching notification —
LegalChangeInformational ("no action required"), DeemedConsentNotice (carrying the
§ 308 Nr. 5 lit. b "silence counts as consent" warning), or ReconsentRequired — and, with
durable_medium.proof on, writes an append-only row to legal_notices proving the notice was
delivered. Only ActiveReconsent ever blocks access on a change — a mode says how a version
change is communicated, and it has no say over a subject who never accepted the document in the
first place. That second question belongs to gate.first_use.
Who a version is sent to
The audience depends on the mode, because "must re-consent" and "must be told" are two different populations:
| Mode | Audience |
|---|---|
ActiveReconsent | subjects the gate will actually stop — those holding only an older major |
InfoPush, DeemedConsent | every current party to that document, in that locale and tenant |
A notice duty under § 327r Abs. 2 BGB, § 675g Abs. 1 BGB, P2B Art. 3(2) or DSA Art. 14(2) attaches to being a party, not to holding an outdated version — so a non-gating change goes to everyone, while a gating one is addressed to exactly the people its middleware will block.
Two document classes are never swept, and both exclusions are deliberate. An informational
page (Impressum, cookie policy) is never accepted by anyone, so there is no ledger to draw an
audience from. A real consent (consent) is never nagged about a change: Art. 7(4) DSGVO. If a
voluntary consent's scope changes materially it needs a fresh, active opt-in — collected in your own
UI, not pushed as a notice.
The sweep runs hourly and is idempotent; it is auto-scheduled unless you turn
schedule.dispatch_notices off. See the delivery proof for what it
records.
The invariants (never violated)
- A privacy notice is acknowledged, never consented, and a change to one never gates — a
material privacy update is
InfoPush, announced but non-blocking (WP260 rev.01). A first acknowledgement is a different matter and can be collected at a first-use gate: nothing was announced there because nothing moved, so no mode applies and no consent is manufactured. - A real consent is never refreshed by silence or deemed consent; a material scope change needs a fresh, active opt-in (EDPB 05/2020).
- Deemed consent lives only in the contract type, and only for minor changes (BGH XI ZR 26/20, EuGH C-287/19).
- Advance-notice periods are per regime, never one global value (see
notice_periodsin the configuration reference).
Which mode a document type admits
The table is the whole rule, and it is worth reading before you pick a mode rather than after the publisher refuses one. Every cell is enforced at publish time.
| Document type | --editorial | --info | --deemed | --active |
|---|---|---|---|---|
contract_terms | minor only | minor only | minor only | major only — and required on one |
privacy_notice | minor only | yes — required on a major bump | never | never |
consent_optin | minor only | minor only | never | major only — and required on one |
informational | the only one | never | never | never |
Three of those cells are refusals with a reason, and the reasons are not interchangeable:
--activeon a privacy notice is never lawful. A privacy notice is information: it is acknowledged, never gated. Blocking access to force acknowledgment is unlawful pressure (WP260 rev.01 Rz. 30-31). This is the one that surprises people, because every other material change gets stricter as it gets more serious and this one does not.--deemedoutside a contract is never lawful. Zustimmungsfiktion — silence as consent — rests on § 308 Nr. 5 BGB and BGH XI ZR 26/20, both of which are about contracts. A real consent can never be deemed at all (EDPB 05/2020 Rz. 79).- An informational page takes only
--editorial. It binds nobody, so there is no acceptance to deem or re-request and no recipient to notify: the notice sweeps resolve recipients from ledger rows, and this type never writes one.
If the mode you need is refused, the bump is the thing to change, not the mode. A change
that has to go out as --info or --deemed is a minor or patch bump of the source version, and
one that has to go out as --active is a major bump; the major bump is what declares it
material, and material is what forces the gate.
A major version bump forces its mode
The publisher refuses --info and --deemed on a major bump of a contract — a material core
change cannot ride on silence or mere information (BGH XI ZR 26/20) — and refuses anything but
--info on a major privacy bump, because a privacy notice is acknowledged, never gated.
Publish a change that needs --info or --deemed as a minor or patch bump of the source
version.
And the converse: a mode that gates has to raise the major. The gate compares major versions,
so --active on a minor or patch bump of a contract or a real consent would reach nobody who
accepted the current major: the version would say a re-consent was requested, and no earlier
acceptor would ever be asked. The publisher refuses it and names the version to publish instead.
A document's first publication is not a bump and is unaffected: --active there is how the first
acceptance is collected.
Saying what changed
A notice that only names the document tells a reader nothing they can act on. Describe the change per locale and every notice carries it — see Saying what changed.
Worked examples
- An info-only contract change — announced, no action required, no one blocked.
- Deemed consent with an objection window — silence binds, provably.
- Active re-consent — a material core change, with a hard gate at the deadline.
- Saying what changed — the per-version delta a notice leads with.