The local plugins and components are:

  • emergence-hero — homepage identity with its standalone theme control, separate Briefings and Reviews editorial indexes, and the Concepts network-and-search landing surface. Each editorial index normally reads at most ten non-unlisted pages from its matching collection, validates format, date, and field, and renders the shared 2-column card grid. The local draft-preview workflow also includes unlisted pages and marks them Draft; ordinary builds do not. Briefings accepts Briefing; Reviews accepts Paper Review or Topic Review. The format tag stays plain and non-interactive; a field-grouped summary (see Briefing and Review authoring) renders each field label as a tag-styled link into that field’s section on the item’s own page. A client-side field/date filter renders above the card grid once an index has more than one entry and more than one distinct field. The exact empty copies are No briefings have been published yet. and No reviews have been published yet.,
  • emergence-fields — three compact collection links on the homepage,
  • emergence-recent — the latest three explicit reader-visible changes on the homepage and the full ledger on /about/updates; it reads only content/about/updates.md frontmatter, renders homepage items as title then secondary date with no type, and renders full-ledger items as title, optional summary, then date · type,
  • emergence-about-nav — the common reader header throughout /briefings/**, /reviews/**, /concepts/**, and /about/**; it combines the four project tabs, branch-specific section navigation, deeper-page or item-format eyebrows, and compact Search, theme, and reader controls. The About overview leaves section routing to its grouped body directory, while an About descendant shows only its current Project, Collections, or Practice group, and
  • emergence-sitelinks — the quiet lower link row and the desktop/tablet control that collapses the entire left navigation sidebar. The homepage shows only the supporting About and GitHub links; other pages retain Home, Briefings, Reviews, Concepts, About, and GitHub.

dist/ is generated output and remains ignored. From site/, npm run build-local-components rebuilds every local package after source changes, type-checks its source, and emits both JavaScript and index.d.ts declarations. npm run build invokes the same step through prebuild, while npm run check runs it before the repository TypeScript and Prettier checks. The shared components/build.mjs script owns this process; do not restore separate copy-pasted esbuild commands per package. The Docker context excludes local dist/, node_modules, public, and .quartz cache links. Its builder copies the component sources, rebuilds them, and reconnects the local plugins against container paths before the served Quartz build, so a clean deployment does not depend on untracked output or host-specific symlinks.

To review draft collection cards in their real hub context, run npm run preview:drafts from site/. This sets EMERGENCE_PREVIEW_UNLISTED=true only for that local preview build, includes unlisted: true Briefings and Reviews in their matching recent-entry indexes, and labels them Draft. It does not change frontmatter or publication status. npm run build remains the production-equivalent check and must continue to exclude those pages from the indexes, search data, sitemap, and RSS.

Style ownership is explicit: a component’s own .emergence-* DOM styles live with that component (emergence-hero keeps them in src/styles.ts), while route shells, Quartz grid/sidebars, Quartz internals, and authored-Markdown patterns live in quartz/styles/custom.scss. A component stylesheet must not reach into another component or into body, .page, #quartz-body, .page-header, .center, or Quartz sidebars. This boundary prevents the same visual rule from drifting between Component.css and custom.scss.

quartz.lock.json pins remote Git plugins only. Local packages are rebuilt and linked from quartz.config.yaml, so they are not recorded as host-specific absolute paths in the lockfile.

The standard @quartz-community/folder-page emitter stays enabled because authored index.md files need it to produce folder routes such as /about/ and /reviews/paper/. Counts and expanded subfolder contents are disabled. Custom collection hubs suppress the emitter’s duplicate listing because their own components already provide discovery; Review subtype indexes retain the simple generated listing. The post-build content-tree check prevents the emitter’s fallback virtual pages from masking a missing index.md.

After a full build, scripts/check-content-tree.mjs checks the repository’s page/folder parity: every content folder must contain an authored index.md, and every Markdown source must produce its corresponding HTML route.

The sidebar control is hidden on the homepage, all reader-frame pages, and mobile layouts. On the remaining default-frame pages it removes the left column from the Quartz grid, preserves the normal right-sidebar behavior, exposes its state through aria-expanded, and stores the preference locally for later navigation.

The Updates ledger is explicit editorial data rather than an automatic modified-date feed. Add only reader-visible collection, Policy, or Site changes; internal implementation work does not belong there. Each entry requires a valid date, supported type, title, and root-relative internal href; malformed entries stop the build rather than disappearing from the public feed. Homepage and full-ledger views are ruled lists with no cards, badges, or fixed columns. A reader-visible modification and its date are recorded here and do not bump a document above newer initial publication dates.

The Briefings and Reviews indexes order non-unlisted entries newest-first by initial publication date and use plain, uncolored labels rather than category badges. Their listing contracts are collection: briefings, format: Briefing and collection: reviews, format: Paper Review|Topic Review, plus date, field, and optional summary. unlisted: true keeps a page out of indexes and discovery surfaces. Format and field are validated at build time. A client-side field/date filter (shipped 2026-08-10) renders above the card grid once an index has more than one entry and more than one distinct field; dedicated filter routes (e.g. a real /briefings/quantum page) remain deferred — see Open operating decisions.

See Site maintenance for the rest of the maintenance self-check.