The glossary

The lexicon

70 of 70 familiesSource markdown

Minn needs to speak the language WordPress software uses with hosts, plugins, and tools. It does not need to implement every word that software speaks.

WordPress software is a language with three audiences. The engine answers two of them. The third belongs to Minn Admin. This file is the policy the inventory in contracts/api/ does not have: which families Minn implements, which it recognizes so plugins can load, and which it will never host.

Agents read this before adding a runtime symbol. An inventory with no mute list reads as a to-do. That is how /wp-admin/ chrome keeps getting pulled in.

Three audiences

AudienceWhat WordPress says to themMinn
Toolingschema, wp-config.php, wp/v2, WP-CLI, probesSpeak. This is Tier 1.
Plugin PHPhooks, options, WP_Query, $wpdb, register_rest_routeSpeak enough that unmodified plugins load. This is Tier 2.
Humans in a browser/wp-admin/ chrome, list tables, meta boxes, dashboard, Customizer, Gutenberg appMute. Minn Admin is the only UI.

/wp-admin/ is not a Minn surface. The path exists so monitors do not 404: it 302s to /minn-admin/. Nothing behind it is rendered.

Three statuses

StatusMeaningTest
SpeakImplement at oracle parity (or a documented subset). Fixture plus live diff.A host, a backup tool, Minn Admin, or a front-end plugin cannot tell.
HearRecognize, record, stub, redirect, or refuse honestly. Enough that plugin load does not fatal. No product UI.A plugin that calls it at init still loads. A human never sees a WordPress screen.
MuteNamed refusal. Do not implement. Do not host. An adapter, a 302, a 403, or a 404 is the answer.The name stays in data/placeholder-symbols.json. It does not graduate into real wp-api/ just to shrink the skip list.

The load-bearing split is admin registration (Hear) versus admin UI (Mute). Plugins call add_menu_page during admin_menu. The engine records the row. It never paints .wrap. Minn Admin adapters own the human surface.

"Any plugin just works" means front end and data. It does not mean the plugin's PHP settings form appears.

How a name graduates

A placeholder becomes real wp-api/ only when all three are true:

  1. A front or REST plugin needs non-neutral behaviour.
  2. Minn Admin (or CLI / ops) already owns the human UI for that job.
  3. The implementation lives in src/Minn/ with a thin facade, not a wp-admin screen.

If the only caller is wp-admin/includes/* or a plugin's admin_menu callback, leave the placeholder. PlaceholderTrace (the opt-in log at wp-content/minn-placeholder-trace.log) is how to prove that.

The name lists:

contracts/api/*.json is the dictionary of words WordPress speaks. This file is the Minn column.


Speak

Families the engine implements. Subset gaps live in the linked contract, not here.

Operational contract (Tier 1)

FamilyWordPress wordsMinnContract
Portable site unitwp_* tables, wp-content/, dumpsRead and write the live schema. Tolerate serialized blobs forever. Extra plugin tables unread (preflight AMBER).(planned schema/; used via Minn\Db)
Boot / file layoutindex.php, wp-config.php, wp-settings.php, wp-includes/version.phpShape files only. wp-config.php untouched. Engine boots from wp-settings.php → minn/bootstrap.php. No wp-load.php on disk.layout.md
REST wp/v2posts, pages, types, statuses, taxonomies, terms, users, comments, media, search, settings, plugins, themes, menus, menu items and locations, navigation, templates, template parts, global styles, blocks, block types, widgets, sidebars, revisions, autosaves, application-passwords; batch/v1; wp-abilities/v1Core routes Minn Admin and tooling call. Plugin routes via register_rest_route.rest/*.md
Authcookies, session_tokens, wp_rest nonce, $wp$ hashes, capabilitiesCross-accepted both directions.rest/auth.md, rest/caps.md
Login endpointwp-login.phpProbe, session, registration and password-reset surface, with plugins' login hooks. Human page is /minn-admin/login. Bare GET 302s there.rest/auth.md
Permalinkspermalink_structure, ?p=, archives, _wp_old_slugResolver plus every link field.front/permalinks.md
Feeds / sitemaps / probes/feed/, /wp-sitemap.xml, robots.txt, wp-cron.phpByte-level where the contract says so.front/probes.md
Block renderpost_content block markup, content.renderedEngine parser and renderer. Block templates are read as data.blocks.md, front/theme.md
Block themestheme.json, templates/, parts/, wp_template*Read as data.front/theme.md
Classic PHP themesget_header(), PHP template hierarchyHierarchy, wp_head defaults, live body parity.front/classic.md
WP-CLI opsoption, user, plugin list/install/update/activate/delete/search, theme list/install/update/activate/delete/search, rewrite flush/structure, maintenance-mode, db, search-replace, wp minn *before_wp_load verbs plus WP-CLI's own config/db. Every other command, a plugin's own included, runs on the engine's runtime.cli.md
Cron / maildue future posts, wp-cron.php, wp_mail, password resetEngine runner. Due cron option events fire on every trigger. wp_mail runs on the engine's own PHPMailer.cron-mail.md
Install / ejectfive-minute install, core files on diskminn install / eject. Not install.php.docs/install.md

Runtime, plugin PHP (Tier 2)

FamilyWordPress wordsMinnContract
Hooks + lifecycleadd_action, add_filter, muplugins_loaded → wp_loaded, wp_head, the_contentClean-room hook engine. Observed order.runtime.md, api/lifecycle.json
Options / transients / cacheget_option, set_transient, object cacheDecoded without unserialize().runtime.md
Posts / query / terms / typesWP_Query, wp_insert_post, register_post_type, WP_TermFacade over src/Minn/.runtime.md
Users / caps / metaWP_User, current_user_can, get_user_metaSame identity stack as REST.runtime.md, rest/caps.md
$wpdb / dbDelta$wpdb->prepare, dbDeltaAlways present (the gate cannot see $wpdb).runtime.md
Media APIwp_get_attachment_image_src, subsizes, srcsetGD. Imagick is not used.runtime.md, rest/media.md
REST registrationregister_rest_route, WP_REST_Server, rest_do_requestPlugin routes after the engine's. In-process wp/v2 hits the engine.runtime.md
Blocks APIregister_block_type, parse_blocks, block.json, render_blockTwo-way bridge with the engine renderer.runtime.md, blocks.md
Shortcodes / assets / i18nadd_shortcode, wp_enqueue_script, __()Shortcodes after the engine pipeline. jQuery is MIT, ours. Text domains load from .mo and .l10n.php files.runtime.md
HTTP / cron APIwp_remote_get, wp_schedule_event, WpOrg\RequestsThe engine's own HTTP client, the Requests library included; option-shaped cron.runtime.md
HTML APIWP_HTML_Tag_Processor, WP_HTML_ProcessorMaps to Minn\Html\Tags. WP_HTML_Processor builds the reference's tree.runtime.md
admin-ajax.phpwp_ajax_{action}, wp_ajax_nopriv_{action}, heartbeatRuns plugins' handlers as WordPress does. is_admin() is true there.runtime.md
WidgetsWP_Widget, register_widget, the default widgetsRender in classic sidebars at the reference's output.runtime.md
Rewrite rulesadd_rewrite_rule, add_rewrite_endpoint, $wp->query_varsPlugin rules and endpoints resolve requests. $wp holds the reference's request parse.runtime.md
Interactivitydirectives, script modulesEngine's own JS at /minn/assets/*.js. Editor packages are not provided.runtime.md

Minn Admin (the human UI)

FamilyWordsMinnContract
Admin SPA/minn-admin/, window.MINN, minn-admin/v1Engine serves the shell and the namespace. The app is the plugin.minn-admin.md, rest/minn-admin-v1.md
Front barsigned-in editor bar on themed pagesEngine's own bar, not the WordPress admin bar.minn-admin.md

Hear

Recognized so plugins boot. Never a screen.

FamilyWordPress wordsWhat Minn doesWhat it does not do
Admin menu registrationadd_menu_page, add_submenu_page, add_*_page, $menuRecords the row. Returns the reference's hook name.Does not render a menu or host admin.php?page=.
Settings API (registration)register_setting, add_settings_section, add_settings_fieldRecords. Markup helpers are pinned so a callback that builds HTML does not fatal.Does not serve options-general.php. Minn Admin Settings is the UI.
Meta boxes / dashboard widgetsadd_meta_box, wp_add_dashboard_widgetStores {id, title, callback}.Does not paint meta boxes or the dashboard.
is_admin()is_admin(), WP_ScreenA request flag. False on public pages and on /minn-admin/; true on admin-ajax.php, as on WordPress.Does not become true just so plugin admin-only code runs.
admin-post.phpform POST sinkNamed stub.Not a form host.
File skeletonwp-includes/.php, wp-admin/includes/.phpOne-line placeholders so require ABSPATH . 'wp-admin/includes/…' does not fatal. Gitignored.Not WordPress source. Not a load path.
admin_url()URL builderReturns /wp-admin/… strings plugins write into data.Those URLs 302 to Minn Admin. They are not screens.
Customizer classesWP_Customize_Manager and its controlsExist so plugins construct them.Nothing is served.
IXR_ClientJetpack connection plumbingInert placeholder.Out of scope (2026-08-30).

Mute

Never implement as a product. Minn Admin already covers the daily jobs. The rest is a 302, a 403, a preflight flag, or an adapter.

/wp-admin/ as a product

The path 302s. These families are the screens behind it. None of them are coming.

FamilyWordPress screensMinn Admin counterpart
Admin chromeadmin.php, admin-header.php, menu.php, load-scripts.php, load-styles.phpThe SPA shell. No .wrap, no Dashicons, no wp-admin CSS.
Dashboardindex.php, About / Credits / Freedoms/minn-admin/overview
Posts / pages / CPTsedit.php, post.php, post-new.php, edit-form-advanced.php, edit-form-blocks.php, revision.php/minn-admin/content + /editor/{type}/{id}
Commentsedit-comments.php, comment.php/minn-admin/comments
Termsedit-tags.php, term.php/minn-admin/terms
Media library chromeupload.php, media.php, media-upload.php, async-upload.php, Thickbox, Plupload/minn-admin/media over wp/v2/media. No iframe uploader.
Appearance: themesthemes.php, theme-install.php, theme-editor.phpExtensions → Themes. Theme file editor is mute (a footgun).
Customizercustomize.php, WP_Customize_*, custom-header.php, custom-background.phpIdentity, logo, homepage, language, Design (Additional CSS) in Settings. Other theme mods stay a link-out on WordPress; on the engine they are absent.
Site Editor (FSE app)site-editor.php, edit-site JSMute SPA. Saved wp_template / wp_template_part / wp_navigation are front data (Speak).
Widgets screenwidgets.php/minn-admin/widgets on classic themes only.
Nav menus screennav-menus.php/minn-admin/menus on classic themes; wp/v2/menus as data.
Plugins screensplugins.php, plugin-install.php, plugin-editor.php/minn-admin/extensions. On the engine: no wp.org plugin search; zip-URL / GitHub / minn.json only. Plugin file editor is mute.
Users / profile screensusers.php, user-edit.php, profile.php, authorize-application.php/minn-admin/users, /profile. Application-password routes are Speak; the grant screen is mute.
Settings screensoptions-general.php, writing, reading, discussion, media, permalinks, privacy/minn-admin/settings tabs (Site, Visibility, Homepage, Content, Comments, Design).
Tools / import / export / GDPRtools.php, import.php, export.php, export-personal-data.php, erase-personal-data.phpSystem Tools card is a link-out on WordPress. Hidden on the engine.
Site Health screenssite-health.php, site-health-info.php/minn-admin/system health checks. Full Site Health UI is mute.
Updates UIupdate-core.php, update.php, upgrader skinsExtensions + Update everything. No upgrader iframe.
Install / repair wizardsinstall.php, setup-config.php, upgrade.phpminn install.
Links / blogrolllink-manager.phpDead product. Mute.
Multisitenetwork.php, wp-admin/network/*, wp-signup.php, wp-activate.phpOut of scope. Single-site only.

Other mute product families

FamilyWhat WordPress shipsMinn stance
XML-RPC / pingback / trackbackxmlrpc.php, IXR_*, wp-trackback.phpGET 405, POST 403. No server, no client.
Gutenberg editor JSedit-post, block-editor, block-library JS, @wordpress/* editor packagesMinn Admin's own editor. Do not ship those packages.
Classic editor / TinyMCE / Quicktagswp_editor(), js/tinymce/wp_editor stays a placeholder.
Dashicons + wp-admin CSSdashicons, color schemesNo GPL assets. A REST dashicons- string* on a type is interface, not the font.
Heartbeat / pointers / WP admin barheartbeat.js, wp-pointer, default admin barPeople see only the Minn bar. WP_Admin_Bar and heartbeat are real for plugins. Pointers are mute.
CodeMirror file editorstheme-editor, plugin-editorMute.
wordpress.org directory / upgraderthemes_api, WP_Upgrader*, language-pack download UIMute as product. Themes search on the engine is a deliberate exception (themes are data the front renders).
Filesystem credentials modalFTP/SSH promptdirect only. No modal.
Press This / mail-by-post / OPMLpress-this.php, wp-mail.php, wp-links-opml.phpMute. Files absent.
WooCommerce-shaped sitesorders, products, Woo adminOut of scope for years. Brochure, forms, and content are the tractable slice.
Plugin settings pagesadd_options_page callbacks, admin.php?page=Hear the registration. Mute the host. Adapter, or the page does not exist.

Names that stay placeholders

Do not implement these in wp-api/ to shrink Plugins::skipped(). They are WordPress product chrome.

List tables / screen chrome: WP_List_Table, _get_list_table, list_meta, post_tags_meta_box.

Media upload chrome (not wp/v2/media): media_upload_header, media_send_to_editor.

Classic / iframe editor: wp_editor, _wp_get_iframed_editor_assets, get_block_editor_server_block_settings, get_default_block_editor_settings.

Admin CSS / color schemes: wp_admin_css, wp_admin_css_color.

Upgrader / zip / file-mod UI: WP_Upgrader, WP_Upgrader_Skin, File_Upload_Upgrader, PclZip, themes_api, find_core_update, wp_version_check, wp_update_plugins, wp_update_themes, unzip_file.

XML-RPC client: IXR_Client, IXR_Error, IXR_Message, IXR_Request.

Theme file editor: wp_get_theme_file_editable_extensions.

Some admin helpers plugins call for data were made real once probes captured what WordPress returns: post states, hidden meta boxes, postbox classes, column headers, quick-edit data, comment hotkeys, the importer registry, delete_plugins, the admin bar's init and WP_Block_Editor_Context. They return what WordPress returns and still paint no screen.

Most of the placeholders that were data have graduated: WP_User_Query, meta-by-mid, WP_Theme_JSON, the POMO Translations and MO classes, and WP_HTML_Processor. The REST controllers plugins subclass and the POMO_*Reader classes are still placeholders and may graduate under the three tests. They are not mute chrome.


Agent checklist

Before adding code for a WordPress word:

  1. Which audience is it for: tooling, plugin PHP, or a human in a browser?
  2. If a human in a browser: stop. Point at Minn Admin, or name the gap in Minn Admin. Do not build /wp-admin/.
  3. If plugin PHP that only runs on admin_menu / admin_init to paint a screen: Hear (record / stub). Do not host.
  4. If tooling or front-end plugin PHP: Speak. Capture from the oracle, implement from the capture, pin a suite.
  5. Never graduate a mute name out of placeholder-symbols.json to make the symbol gate go green.