Highlights
Changed — access-control library-missing warning now routes through the shared AcrossAI notice hub. The pre-0.0.20 AcrossAI_Abilities_Access_Control::maybe_show_library_notice() method was hooked on WordPress core admin_notices and printed a raw .notice.notice-warning banner on every admin screen when the wpb-access-control library wasn't loaded. It is renamed to register_library_notice( array $notices ): array and now registers into the new acrossai_notices filter shipped by acrossai-co/main-menu 0.0.30. The notice appears in two places instead:
- As a card on the new AcrossAI → Notices submenu (only registered when at least one notice is present, with a WP-style count bubble on the menu label).
- As a single top-of-page WordPress-native
.notice.notice-warning.is-dismissiblesummary banner ("AcrossAI has N notifications for your attention — View notices →") printed on every other admin page. Dismissal is fingerprint-persisted per user (_acrossai_notices_summary_fp) and the summary re-appears whenever the notice set changes.
Notice record shape: id=wpb_access_control_missing, type=warning, source=AcrossAI Abilities Manager. Semantics are unchanged — the fail-open behaviour (per DEC-PERM-CB), the manage_options gate, and the message copy are all preserved.
Composer dependency bump — acrossai-co/main-menu 0.0.29 → 0.0.30. Ships the cross-plugin notice system this release routes through:
- New
acrossai_noticesfilter — any AcrossAI consumer plugin can push admin-notice records into a shared collection using a single documented record shape (id,title,message,type, optionalsource, optionalaction { label, url }). Later registrations of the sameidare ignored (first-wins). Missingidor bothtitleandmessageempty → the entry is dropped. - New AcrossAI → Notices submenu (slug
acrossai-notices, classNoticesPageRenderer) — only registered when at least one notice exists. Menu label carries a WP-style count bubble (.awaiting-mod). - New top-of-page summary notice emitter (
SummaryNoticeEmitter) — prints one WordPress-native dismissible banner on every other admin page linking to the Notices submenu. Fingerprint-based dismissal (SHA-1 of sorted notice IDs stored in per-user meta). - New AJAX endpoint
wp_ajax_acrossai_notices_dismiss_summary— nonce +manage_optionsguarded; server re-validates the client-supplied fingerprint against the current notice set as defense-in-depth against poisoning the user meta with an unrelated hash. - New public classes under
AcrossAI_Main_Menu\:Notices,NoticesPageRenderer,NoticesAjaxHandlers,SummaryNoticeEmitter. New page-slug constantSettingsPage::NOTICES_SLUGand static accessorSettingsPage::get_notices(): ?Notices.
Intentionally unchanged
- The vendor-missing boot-resilience notice in
Includes\Main::__construct()remains on coreadmin_notices. That code path fires precisely when the composer autoloader is absent — the moment when the shared main-menu package isn't loadable either — so theacrossai_noticesfilter cannot be reached from it. Matches Constitution §V Integration Resilience.
No breaking changes
- No ability slug rename.
- No REST endpoint change.
- No option-shape change.
- No new required capability.
- Existing 218 abilities behave identically.
- Safe upgrade from
0.0.19.
Composer
"acrossai-co/main-menu": "0.0.30"Full Changelog: 0.0.19…0.0.20