Repository navigation
Releases: wearenoformat/nf-logbook
Releases · wearenoformat/nf-logbook
Release list
Noformat Logbook 1.3.1
Fixed
- Update checks on shared hosting. GitHub's API allows 60 anonymous requests per hour per IP address, and hosts such as WP Engine send many sites through one address, so "Check now" could fail with "API rate limit exceeded" for hours. Without a token, a rate-limited check now reads the latest release's
manifest.jsonthrough the plain download link (github.com/{repo}/releases/latest/download/manifest.json), which is not counted against that limit. The package must be this repository's own release download, and its SHA-256 is verified as before. Private repositories (with a token) are unchanged.
Noformat Logbook 1.3.0
Added (resolve issues)
- Resolve / Reopen in the System log line detail for warning, error and critical events, Resolve all open (every open warning/error/critical issue in the current filters, at most 200 per call) and a Hide resolved toggle (
resolved=hide, also honoured by the live tail and the export). Resolved lines are shown dimmed with a Resolved chip. - An issue is the event's fingerprint, or the single event (
event:<id>) when it has none. Resolving records "resolved through event id N" (N = the newest event with that fingerprint at that moment),resolved_atandresolved_by(user id only). An event counts as resolved iff its id ≤ N, so a later occurrence opens the issue again; resolving also closes the fingerprint's aggregation window so the recurrence is stored as a new event instead of raising the resolved event's count. - Resolved issues are excluded from the System log severity counters, the Content log "Needs attention" line and the dashboard widget's system line (whose links now open the System log with
resolved=hide). - New events
logger.issue_resolvedandlogger.issue_reopened(system, notice, objectissue / <fingerprint|event:id>, context{fingerprint, event_id, through_id}/{fingerprint, event_id}), one per issue, also for Resolve all open. The Controlroom mirrors resolutions from them. wp nflog resolve <fingerprint|event:ID>... | --all-open [--window=…]andwp nflog reopen <fingerprint|event:ID>....- Admin AJAX
nflog_resolve/nflog_resolve_all(POST, nonce,manage_optionsplus System log access).
Storage
- Schema version 2: new table
{prefix}nflog_resolutions(issue_keyPK,fingerprint,event_id,through_id,resolved_at,resolved_by), created by the existing dbDelta upgrade (Schema::maybeUpgrade(), admin and WP-CLI). Prune removes resolutions whose events are all gone (through_id≤ the prune boundary); uninstall drops the table with the others. Events, the hash chain and{prefix}nflog_fingerprintsrows are not changed. - Until the upgrade has run, views simply show nothing as resolved.
Unchanged
- REST API and
docs/CONTRACT.md: events are served as stored;GET /summaryandGET /healthkeep counting every event. The manifest reports database schema 2.
Noformat Logbook 1.2.0
Changed (name)
- The plugin is renamed from Noformat Logger to Noformat Logbook: folder and slug
nf-logbook, main filenf-logbook.php(basenamenf-logbook/nf-logbook.php), text domainnf-logbook, admin page Tools → Noformat Logbook (tools.php?page=nf-logbook&tab=…), repository andUpdate URIhttps://github.com/wearenoformat/nf-logbook, release assetnf-logbook.zip(top foldernf-logbook/, manifestslugnf-logbook), MU loadermu-loader/nf-logbook-loader.php. Every user-visible string (admin titles, Tools submenu, notices, dashboard widget, CLI messages, View details, docs) says Noformat Logbook. The plugin's own events (logger.*) carryobject_idnf-logbook. - Unchanged (wire and storage contract): REST namespace
noformat-logger/v1and its routes, theX-NF-*signing headers, the hash chain and canonical JSON, the producer namewp-noformat-logger, event fields, tables{prefix}nflog_*, options and transients (nflog_*,noformat_logger_*), constantsNOFORMAT_LOGGER_*, hooksnoformat_logger/*, capabilities, cron hooks,wp nflogand the PHP namespaceNoformat\Logger.uninstall.phpdrops the same tables and options as before. tools.php?page=noformat-logger[&tab=…]redirects (301) totools.php?page=nf-logbookwith its tab and filters, next to the existing 1.0 and 0.x redirects.wp nflog install-mu-loaderinstallsnf-logbook-loader.phpand removes an oldnoformat-logger-loader.phpfrom mu-plugins.
Upgrade note
- Sites on 1.1.x cannot auto-update across the rename (WordPress sees a different plugin). Once per site: deactivate Noformat Logger, remove
wp-content/plugins/noformat-logger/without WordPress "Delete" (that runsuninstall.php, which drops the log tables when "delete data on uninstall" is set), installnf-logbook.zipand activate Noformat Logbook. The log, chain, key and settings carry over because the tables and options are unchanged. Details:docs/UPDATES.md→ Upgrading from 1.1.x.
Tests
- Unit and integration tests use the new slug, folder and asset name;
setup.shlinks the plugin asplugins/nf-logbook(and drops a danglingplugins/noformat-loggerlink);smoke-admin.shchecks the 1.1 redirects;smoke-errors.shchecks thatinstall-mu-loaderremoves the old loader file. tests/integration/smoke-update-private.sh(inrun-all.sh): the updater's private-repository (token) path end to end against a GitHub emulator mu-plugin (tests/integration/github-emulator.php, apre_http_requestfilter; no network to GitHub, no real token): 404 without a token, 401 with a wrong one, 200 / ETag 304 with the right one, manifest and package through the asset API with the redirect to storage followed withoutAuthorization,wp plugin updateto 9.9.9, SHA-256 refusal of a tampered zip, and the token never printed or stored.
Noformat Logger 1.1.1
Changed
- Plugin description: "Tamper-evident, privacy-preserving log of content changes and error, security and stability signals." (the clause about the Controlroom reading it over a signed API is gone from the header and the View details modal; the signed API itself is unchanged).
Fixed (noise in the Content log)
Machine-written state no longer shows up as content changes. Both rules log the write at debug with context.technical: true and context.technical_reason, so it is dropped unless log_debug is on (like the existing technical meta keys). Notice and critical options (siteurl, home, admin_email, {prefix}user_roles, users_can_register, default_role, active_plugins, blogname, permalink_structure, theme_mods_*, … and anything the noformat_logger/option_severity / critical_options filters raise above info) are always exempt.
- Write-on-read rule (
RequestContext::machineWriteReason()): anoption.*ormeta.*(all object types) write during aGETorHEADrequest (front-end views, admin page loads, REST GETs; reasonread_request), during WP-Cron (cron) or in the admin-ajaxheartbeataction (heartbeat) is machine state. A non-REST GET that carries_wpnonce(activate / trash links, bulk edit onedit.php) is still a deliberate action. POST/PUT/PATCH/DELETE, REST writes, forms and WP-CLI are unchanged; ACF grouped events are unchanged. - State-key patterns (
Config::defaultTechnicalKeyPatterns(), filternoformat_logger/technical_key_patterns; reasonkey_pattern), whatever the method: names containing a state word (dismissed,pointer(s),version_info,usage_analytics,sticky_admin_messages,last_checked,last_run,last_update_check,transient,batch,queue,lock,telemetry,install_date,activation_time,review_notice) or ending innotification(s)/notices/admin_notice, and the prefixeswp_yoast_,_yoast_,imagify_,gsmtp_,gform_version,_transient_,_site_transient_plusrg_gforms_message. Keys ending in_settings/_optionsare exempt (imagify_settingssaved from its screen staysinfo), and so are the Yoast fields an editor types (MetaListener::MEANINGFUL_KEYS). Coverswp_yoast_notifications,wpseo_notifications,gsmtp_version_info,gform_version_info,gform_sticky_admin_messages,imagify_optimize_media_batch_*.rg_gforms_*as a whole is deliberately not on the list: most of those options are Gravity Forms settings.
Changed (errors)
doing_it_wrongfor_load_textdomain_just_in_time(raised on every request by translation-eager plugins since WordPress 6.7) isinfoinstead ofwarning; still aggregated by fingerprint. Every otherdoing_it_wrongstayswarning.
Noformat Logger 1.1.0
Added (updates)
- The plugin updates like any other plugin, from the GitHub Releases of
wearenoformat/wp-noformat-logger(constantNOFORMAT_LOGGER_UPDATE_REPO), with no update server of our own: Dashboard → Updates and the Plugins screen show update now, the auto-update toggle works,wp plugin update noformat-loggerworks, and View details shows the release notes (src/Update/,docs/UPDATES.md). Update URI: https://github.com/wearenoformat/wp-noformat-logger(wasfalse);update_plugins_github.comreturns the latest release's update array,plugins_apithe details modal.- Release discovery: one
GET /repos/{repo}/releases/latestper check, cached 6 hours in the transientnoformat_logger_updatewith the ETag reused (304 keeps the cache); the release'smanifest.json(version, requirements, changelog,sha256) is read only when the release changed. On 403/429/404 or network errors the cached answer is kept and a human reason recorded ("GitHub answered 404: the repository is private or the name is wrong …"). - Every package is downloaded over HTTPS by the plugin and its SHA-256 compared with the manifest; a mismatch refuses the update ("… failed the SHA-256 check …"). The unpacked folder is always renamed to
noformat-logger. Our own update clears the cache and is logged asplugin.updated(by the updater itself when PluginThemeListener is off). - Optional constants
NOFORMAT_LOGGER_UPDATE_TOKEN(fine-grained read-only token for a private repository; it would live in every site's wp-config, a public repository or releases-only mirror is recommended) andNOFORMAT_LOGGER_UPDATE_MANIFEST(self-hosted manifest URL, bypasses GitHub). - Status tab: Updates card (installed, latest, source, last check, result) with Check now for administrators;
wp nflog update-check [--cached] [--format=json]prints the same line. - Packaging:
.distignore,tools/release.sh <version>(version / CHANGELOG / tag checks,composer check, zip with top foldernoformat-logger/,manifest.json, tag,gh release create;--local-onlyfor tests) and.github/workflows/release.yml(same on a pushedv*tag). - Integration:
tests/integration/smoke-update.sh(inrun-all.sh) updates the test site from a locally served 9.9.9 release through WP-CLI and checks that a tampered zip is refused.
Changed (wp-admin)
- The admin UI moves under Tools: one page, Tools → Noformat Logger (
tools.php?page=noformat-logger), replaces the top-level menu and its four submenus; the screens are in-page tabs (Content log · System log · Status · Settings,&tab=content|system|status|settings) styled with the existing design system (.nflog-tabs). - Access rules are unchanged (Content log per
events_visible_to, System log persystem_log_visible_to, Status for everyone who may open the page with key actions formanage_options, Settings formanage_options). A tab the user may not open is not rendered and a direct?tab=request to it answers 403; withouttabthe first allowed tab opens (an administrator underevents_visible_to = capability_onlynow lands on the System log instead of a "no permission" view). - The 1.0 URLs (
admin.php?page=noformat-logger,…-system,…-status,…-settings) and the oldertools.php?page=noformat-logger&tab=eventsredirect with 301 to the matching tab, filters kept. - Every internal link (dashboard widget, the "Needs attention" strip, the Content log / System log cross-links, the console and toolbar filter forms, the Status key form, exports) points to the tabs. New Settings action link on the Plugins screen for administrators.