There was no way to tell installed copies anything. The only thing resembling a
channel was `version.message`, which prints only when the pack format is newer
than the package can read and which then calls process.exit(1) — an
incompatibility signal, and one that would stop a dev server. Using it to
announce a secret rotation would break everyone who had not yet migrated, which
is the opposite of what announcing is for.
So `pack.json` may now carry a `notice`, printed once at start-up and nothing
more: it never throws, never exits, never writes to stderr. It accepts a plain
string or `{ message, until }`, because the field is edited by hand and both
shapes are what someone would reasonably write.
`until` matters more than it looks. A pack stays on disk until the certificate
nears expiry, so a rotation notice would otherwise nag for months about a date
that had already passed. An unparseable `until` shows the message anyway — a
typo in a date must not silence an announcement.
The honest limitation: older versions ignore the field, so they cannot be
reached this way. This only helps from 4.1.0 onwards, which is the argument for
adding it now rather than when it is needed.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>