The live site is marionettejs.com; www.marionettejs.com and v5.marionettejs.com also work. Cloudflare Pages serves one complete artifact. The apex is canonical; v5 remains a noindexed mirror.
Source lives in marionettejs/marionettejs.com. Earlier design commits and checkouts remain
preserved in the old website repository. The local preview still binds to loopback.
This branch imports published 5.0.0 from source
0f2284ad4bbfe8c82ce82714471697a68c2acaeb. The publication run
promoted certification 38032320468;
the stable release
contains the matching archives and evidence. The four runtime registry integrities
and staged documentation manifest match those certified published bytes.
The documentation content digest is
44c0d535fd36d11f31d909246f4ee7c6592eae3f25fb7513c61af65842593a90.
Use this procedure for the stable import and its review. Merging to main deploys both site and MCP and still requires separate approval.
- Obtain the release owner's final published source revision and registry readback for all five packages (core, data, radio, utils and adapters), along with the certification artifact identity. The release owner verifies adapters separately; the website staging script checks only core, data, radio and utils. A successful unpublished build is insufficient.
- With Node 24, run the exact stable install command in the publication section
below, then
npm ci. Review the four runtime lock entries, including transitive radio/utils. Never hand-author registry URLs, integrity values or archive hashes. - Run
npm run docs:stage-stable -- <certified-40-character-source-revision>. This downloads the four exact locked registry archives, verifies their SHA-512 integrities, and compares every installed file with the archive bytes (including runtime code and docs). It rejects linked, modified, missing or extra files; neither package metadata nor the hidden npm lockfile is proof of installed bytes. Registry access andtarare required for staging andvendor:build;vendor:demosalso needs registry access or a warm npm cache for its fresh install.vendor:demosverifies the core bundle hash and uses a fresh script-freenpm cifor data; ordinary tests use local metadata and fixture archives without registry reads. It requires 5.0.0 and the certified revision, then verifies every documentation/asset hash. It exports package bytes plus generated archive evidence tooutput/stable-docs; the evidence file isoutput/stable-docs/stable-docs-evidence.json. Docs and evidence appear together only after every write succeeds. It refuses an existing export directory. Failed runs can be retried; an abruptly terminated run may leave an unused.stable-docs-*sibling inoutput/, which can be removed once that process has stopped. Compare its digest and revision with the release owner's published artifact evidence. - Run
npm run docs:import -- output/stable-docs. Reconcile every reading-copy overlay incontent/docs-publication-edits.jsonagainst the new archive. Remove changes already in the archive and obsolete RC2 limitations; retain only reviewed editorial changes with correct before/after hashes and source identity. Set its packageVersion to5.0.0and status tostable release (published on npm)only with that evidence. Review title edits, navigation and supplemental guides too; remove a supplemental copy when the package now supplies the same guide. Never edit archive bytes. - Run
npm run vendor:build, thennpm run vendor:demos, thennpm run check. Commit the actual lockfile, archive, declaration, bundles, licenses, provenance and generated workshop changes together. Setup instructions derive their exact version/revision from that provenance. MCP and discovery outputs derive theirs from the imported publication. Do not replace historical case-study versions, benchmark evidence, original prompts or the v4 archive. - Run
node scripts/check-agent-site.mjs --local --report output/agent-retrieval.jsonand the full browser checks in.github/workflows/check.yml. The sync validator is for an overlay-only sync PR; this transition instead runs the archive, corpus, import, sync and MCP tests throughnpm run check. Inspect desktop/narrow documentation, homepage title/social metadata, install links, agent setup, llms output and MCP catalog/lookup. Current instructions must no longer call stable a candidate; immutable historical RC2 evidence and generic candidate tests remain valid. - Retain the staged archive URLs/integrities, source revision and content digest
under
releaseEvidenceincontent/docs-publication-edits.json, with the certification/publication run links and separate adapter readback. This structured evidence is committed and served at/docs/publication.json. Update this status and the PR with the verification results. Obtain separate merge/deployment approval. This preparation does not authorize package publication, a site deployment, or changes to credentials/settings.
Reading-copy PR #73 (automation/library-docs-sync, reviewed head 5a2ed828)
was merged into main at 46c3402 and integrated into this branch. Its four
changes are supplied by the stable archive:
package identity guidance in docs/agents.md and docs/readme.md, explicit child
startup cancellation in docs/api/application.md, and Backbone reorder guidance
in docs/packages/adapters.md. The latter limitation still applies in stable;
its guidance is retained in the package, not duplicated in a website overlay.
The old navigation warning is stale; stable supplies the framework-migration guide
and navigation directly. Of the 23 previous reading overlays, only the website's
shorter architecture heading remains. Four later reading edits clarify the View
lifecycle diagram, exclusive child-start coordination, data persistence scope,
and client installation verification without changing the archived package.
The duplicate supplemental migration guide is now replaced by its exact packaged
copy and is available through MCP too.
Do not reintroduce stale RC2 overlays after stable import. Historical RC2
evidence remains in Git and case-study assets.
This integration uses the exact published package pinned in package-lock.json
across documentation, browser demos and workshops. Import consumer docs with npm run docs:import -- /path/to/export.
Website and MCP retrieval use the same imported corpus and packaged records assets.
Runtime version and revision come from the installed package's vendor provenance;
/docs/manifest.json identifies the documentation snapshot. Builds do not publish
the package, website, or MCP service.
A complete import replaces the corpus and its navigation. Preserve matching
snapshot bytes and hashes; import the reviewed clean released source and verify it
against the installed registry archive before setting published metadata. Run
npm run check and review desktop/narrow docs. A main merge deploys both services.
Merging to main publishes the site and documentation MCP.
.github/workflows/deploy.yml runs
npm run check, uploads dist/ to Cloudflare Pages as the site root, and then
verifies the live origin with scripts/check-deployment.mjs ORIGIN --revision SHA.
The website commit is embedded in each generated page and must match the
published commit on every checked route; the sitemap must also match the built
artifact. Manual dispatch is restricted to main. A deployment that does not
serve this revision fails the run. The workflow then publishes the Worker from
the same checkout and compares its live tools, corpus, documents, and examples
with the local build using scripts/verify-mcp.mjs ENDPOINT --revision SHA.
The Worker response revision must match the deployed commit. A failed Worker deployment
or parity check fails the run; rerun the workflow after correcting the cause.
The two service uploads are sequential, not atomic.
After a successful site and MCP deployment, a change to the documentation manifest
or publication metadata calls .github/workflows/context7.yml to request a refresh
of /marionettejs/marionette. Manual deployment also requests a refresh. Marketing
changes do not. Context7 failures fail the separate job after deployment; correct
the cause and use the Context7 workflow's manual refresh rather than redeploying.
Set CONTEXT7_API_KEY in the production environment from the Context7 teamspace
that owns the library. The key is used only by trusted main workflows. The library
repository's context7.json owns indexing configuration; its previousVersions
list declares supported immutable tags. Add the new release tag there as part of
release preparation. Website CI refreshes the library's configured branch, and
Context7 processes the declared versions. Refresh acceptance means queued work;
verify the tag's completed indexing in the owner dashboard.
The same workflow collects measurements weekly and on manual dispatch. It saves
context7-evidence artifacts for 90 days: expected docs identity, reported index
state/date, token and snippet counts, benchmark score (null when unavailable),
available versions, 30-day usage and lifetime topic counts. It makes two read calls,
plus one request on refresh runs; it does not launch a separate paid evaluation.
Configuration failures are reported in the job log before a snapshot is collected.
The API does not attest source revision parity. Check returned snippets against
the expected release before treating a snapshot as evidence about those docs.
Use the owner dashboard to review Benchmark suggestions and question-level results when available. For each candidate improvement, check whether the question is a real supported task and whether the failure came from the docs, indexing, retrieval or grading. Correct the relevant guide or reference, then compare with a saved snapshot. Keep questions and versions consistent where possible; avoid adding prose just to improve a score. Trust scores reflect source reputation, usage reflects reach, and benchmark scores judge documentation answers. None establishes application correctness or agent time/token efficiency; use our consumer checks and controlled tasks for those.
Context7's automatic refresh is usage-triggered with popularity-based thresholds, not a release webhook. See its refresh policy, Actions integration, and current feedback pipeline. The old owner-run benchmarks were deprecated by Context7. There is currently no documented public benchmark trigger. The API may return zero while the dashboard says no benchmark data; this is not a measured failure score.
Documentation HTML also embeds the optional Context7 chat widget with Marionette's
red, a bottom-right position and a short branded welcome. It uses the public library
ID, never the CI API key. Enable it in the owner dashboard's Chat tab and allow
marionettejs.com and the public aliases where it should work. Its current script
sends chat messages to Context7 when visitors submit them; the welcome states this.
The configured library follows the indexed default branch. Check answers against
the docs version shown on the page, especially before a new release is published.
Ordinary docs, Markdown and search work without the widget. The documentation
browser suite checks this by blocking its script; verify the actual widget on the
allowed deployed domain after merging. Chat billing is not specified in the widget
guide; do not infer it from API or private-parsing prices.
All HTML pages include the deferred Docs7 analytics script for connected site
b83657b2-fde7-4916-a683-2d3ba41f185b. This is a public site identifier, not an API
key. Analytics appears in that site's Docs7 dashboard after deployment; embedding
the script alone does not establish that visits have been recorded.
PostHog EU is configured on its capped Free plan through the free managed proxy. Standard page views, sessions, navigation duration, public control clicks, named product events and public-page replay use anonymous SDK identifiers. See the event and setup plan. The /privacy/ page explains collection and offers an opt-out; this control is separate from Context7 and Cloudflare services.
Publishing needs the CLOUDFLARE_API_TOKEN and CLOUDFLARE_ACCOUNT_ID
secrets in the production environment. The token needs Pages Edit for the
deployment account and Individual Workers
Editor access scoped to marionette-docs-mcp. The existing Worker custom domain
is already configured; changing it also requires Workers Routes Edit for the
marionettejs.com zone. The Pages project comes from the CLOUDFLARE_PAGES_PROJECT
repository variable and defaults to marionette-v5.
scripts/check-deployment.mjs ORIGIN --health-only reads the live site and reports what does not
pass health checks: page version strings, provenance, canonical sitemap URLs and
any recorded page modification dates, the
headers that keep a validator on published pages, and the exact bytes of both
vendor bundles. Run it locally, or through the "Deployed site check" workflow,
which also runs daily. Still verify the homepage, Why page, docs, agent briefs
and a real playground interaction by hand after a release.
The v4 GitHub Pages archive preserves the existing
versioned documentation and download paths. _redirects preserves those legacy paths and the published preview URLs
(/docs/regions/ and /reference/region.md); current /docs/ serves the imported package documentation. The old root sw.js unregisters
retained legacy service workers and clears only their named precache. Keep that
retirement file while returning browsers can retain those registrations.
The public read-only documentation MCP endpoint is https://mcp.marionettejs.com/mcp.
See client setup and the Worker deployment runbook.
The Worker and local stdio process share the same verified corpus and tools.
Stylesheets, the JavaScript entry point, and its directly loaded modules use content versions in their URLs so returning visitors receive changed code and styles.
The built HTML contains descriptive page titles, descriptions, canonical URLs,
Open Graph tags, and large-image social cards without requiring JavaScript.
The canonical origin is siteOrigin in scripts/build.mjs.
The main site is indexable and publishes /sitemap.xml. All hosts use canonical
URLs on https://marionettejs.com. Host-specific headers keep v5 and the default
Pages domain noindexed while still allowing agents and social crawlers to read.
The editable share-card artwork is content/social-card.svg; the published
1200 × 630 export is site/assets/marionette-social.png. Export with an SVG
renderer when editing the artwork; normal builds only copy the committed PNG.
Social services may cache old previews after deployment.
Requires Node.js 24 or newer. With nvm, run nvm use before installation. Browser tests also require Chromium (npx playwright install chromium) and the unzip command to verify downloaded projects. Run npm ci before the first build to install the pinned documentation renderer and search tools.
npm run devOpen http://127.0.0.1:4175/. The server rebuilds and reloads on source changes.
Use MARIONETTE_PREVIEW_PORT to select a different explicit port if necessary.
- Homepage: dark interactive composition, draft brand assets, candid positioning, and a real Application with a screen View, CollectionView, and detail Region.
/why/: adoption criteria, community/hiring concerns, the AI-slop question, and evidence boundaries./docs/: the canonical documentation snapshot, with local search, task navigation, diagnostics, and copyable Markdown./thanks/: GitHub Sponsors support, the merch store, credits and review tools, and maintainer acknowledgements. Future supporter names belong here only after confirmation and permission./llms.txt: a compact task-oriented entry point with explicit version/status./agent-prompt.md: optional visible-browser workshop brief with completion criteria./#playground: theatrical reveal, editable JS/CSS, agent build notes, and actual app preview.- Optional WebMCP tools operate the same demo where
document.modelContextis supported.
Canonical documentation is authored in the library repository and imported here as a verified snapshot. This website renders that full snapshot alongside marketing; do not maintain a second handwritten reference.
The invitation copies the current site address. Agents can discover the brief and
use window.MarionettePlayground.open/update/run/inspect/interact/close, matching
WebMCP tools, or the visible editor. Open does not run code. Updates show public
build notes and can change the draft before running. Notes describe useful choices
and observed results, including a candid impression of the library.
Default scope: one small app, a few notes, one interaction test, and at most two repair attempts. Source is omitted from repeated tool responses unless requested. There is no automatic local-project fallback. The user must be able to see the browser; otherwise the agent explains the missing capability and stops execution. Only an explicit Download app click writes a standalone HTML file. Drafts stay in this tab until reload. The export includes the pinned runtime and MIT license and needs no installation or server.
After the first successful app run, a Next steps section appears below the editor and preview and stays available while editing. “View on CodePen” sends the current draft and pinned runtime/license to CodePen’s prefill editor on an explicit click. Save there to obtain an app link; free Pens are public. “Share this experience” shares the public workshop URL only, with no app source, title, or build notes.
This uses an opaque-origin iframe and restrictive CSP, not a hardened hostile-code
execution service. Script-initiated self-navigation and CPU exhaustion need stronger
controls before public use. See planning/agent-discovered-playground.md for the
reassessment and remaining gates.
content/pages.mjs contains the page copy and templates. site/assets/ contains
CSS, the live example, and copied draft brand SVGs. scripts/build.mjs produces
static files in ignored dist/. scripts/dev.mjs serves only that output.
site/vendor/marionette.js bundles the exact published marionette version
with matching @mnjs/radio and @mnjs/utils from package-lock.json. Run
npm run vendor:build after an intentional package upgrade. It verifies the
package/docs versions, bundles ESM with esbuild, includes all MIT licenses, and
records the npm integrity and resulting bundle hash in content/provenance.json.
The homepage and playground use that runtime. Imported documentation must match
its package version and source revision before publication.
Public-facing copy is written for the intended completed Marionette 5.0 launch, as requested by Paul. This is an editorial assumption, not a release action. Preserve the actual pinned runtime/version in provenance. Do not invent benchmark numbers, migration results, or adoption claims.
The invitation opens the workshop directly. Its Agent instructions disclosure
contains the same compiled brief served at /agent-prompt.md, including the exact
executable starter. Browser-only agents can read it without navigating away. The
copied invitation asks agents to open the workshop and read the instructions there;
the brief defines the personal app outcome, runtime contracts, and relevant checks.
The adoption page offers a copyable prompt for the visitor’s own agent. Detailed
objections and evidence limits live in /adoption-review.md, linked from page
metadata, /llms.txt, and the copied prompt. They are generated from
content/adoption.mjs and kept out of the human page’s reading flow. The review
covers both new projects and existing applications; it does not launch the playground or
authorize installation or migration.
motion.js updates decorative parallax on scroll/pointer events through a single
queued animation frame. It does not run a continuous JavaScript animation loop.
The hero runs an Application with a screen View, list CollectionView, and detail
View. Selecting work replaces only the detail; the screen and list retain their
identities. A static SVG thread connects the hero to the agent invitation on desktop,
with its path recalculated only when the layout changes.
The invitation star swings gently toward a nearby mouse pointer around its fixed
string attachment, then settles back on exit. It uses CSS transitions and the same
queued frame, with no idle loop, and respects both motion preferences.
The separate lifecycle illustration has manual Show/Replace/Empty controls and an optional, finite playback sequence. Scrolling never changes the selected stage. The matching code updates with it.
Playback stops on manual selection, Stop, Reduce motion, reduced-motion preference, navigation, or hiding the page. Reduce motion also disables decorative parallax and transitions. Its Reduce motion / Restore motion preference lives in the footer. Reduced motion leaves the manual stage controls available. All screen sizes use normal page flow. Without JavaScript, the reading content and initial diagram remain visible, and inactive controls are disabled.
npm run checkChecks build output, local links/fragments/assets, script imports, and pinned-source integrity, input limits, safe runner serialization, and standalone export contents. Also validate the live demo in a browser: show notes, replace with tasks, empty, show again, and inspect lifecycle events. Confirm destruction counts and that the empty control disables when appropriate. Check mobile layout, keyboard access, and readable pages without JavaScript. Source checks alone do not prove those flows.
Run the automated workshop browser regressions from a fresh checkout with:
npm ci
npm run build
npx playwright install chromium
npm run test:browsertest:browser serves the existing dist/ on an ephemeral loopback port, so rebuild
it after source changes. On Linux CI use npx playwright install --with-deps chromium.
It runs pinned Chromium with experimental web-platform features for native WebMCP,
fails on behavioral assertions, and writes a screenshot to output/playwright/.
The browser command is separate from the Node checks; it needs Chromium installed.
For the ownership regression, after building and starting the preview, run:
node test/browser/playground-ownership.mjsOpen the printed local URL, click Run ownership checks, and verify
18 BROWSER CHECKS PASSED. This uses the real
pinned library in the sandbox to exercise independent state, a nested control click,
template data, replacement, and destruction. It is a browser check, not part of the
Node-only test command. The build generates the agent brief's code example from the
executable starter; a source test prevents the two from drifting.
Import the complete reviewed consumer export from the corresponding library
revision. For a published release, compare it with that package's bundled manifest;
for a candidate, retain its actual revision, dirty flag and local-source publication
status. Never infer publication from the exported latest routing label.
npm run docs:import -- /absolute/path/to/library/.docs-export
npm run check
node test/browser/docs-candidate.mjsThe importer checks bounded paths, symlink containment, unique routes, every source
hash and the aggregate digest before replacing content/library-docs/. Review the
manifest diff and do not edit imported files. Candidate imports replace the prior
corpus, navigation and diagnostic assets together. Original bytes remain available
under /docs/markdown/ and /docs/source/; HTML and reading Markdown resolve links
within the imported snapshot. Code remains intact. Diagnostic schemas are hashed
assets from the same export, rather than an independently maintained supplement.
content/docs-publication-edits.json records publication status and any reviewed
reading-copy changes separately. Website and MCP builds use the same corpus hashes
and source identity. Their included records example comes from the same packaged
source assets. The browser workshop identifies its exact runtime independently.
Published documentation labels require a clean snapshot matching the installed npm archive, including its revision, content digest and locked registry integrity. After an authorized release, upgrade the exact core/data pins together:
npm install --save-dev --save-exact marionette@5.0.0 @mnjs/data@5.0.0
npm ls marionette @mnjs/data @mnjs/radio @mnjs/utilsRequire all four installed versions to match. The vendor builder reads the package's
root docs-manifest.json and requires clean source, matching exact pins and registry
archive URLs/integrities for core, data, radio and utils. Rebuild with
npm run vendor:build and npm run vendor:demos; verify both resulting hashes and
license bundles. npm run build derives the workshop brief, runtime, recipes and
export identity from the resulting provenance, including the released source revision.
Compare every imported page and supporting asset with the installed registry
archive before setting published metadata. Run npm run check,
npm run test:docs:browser, npm run test:browser and
node test/browser/personal-preview.mjs, plus the deployment runbook's HTTP MCP
verification. A local candidate import may be checked before publication, with
its candidate status retained. Final deployment must use the matching registry
runtime and verified publication metadata.
Marked escapes raw HTML and blocks unsafe URL schemes. Pagefind builds a static search index. The browser check covers every imported page at desktop and narrow widths and checks rendered search. It does not run all instructional examples or measure reader effectiveness; those are library/consumer verification boundaries.
Imports stage a replacement and retain the previous directory until installation
succeeds. Failed installation restores it; the next import recovers an interrupted
replacement before checking new input. Build and review the complete dist/
artifact before requesting publication. Main merges deploy both website and MCP,
so package release policy, public endpoint version and source reachability need
agreement before merging this candidate integration.
The existing v0-v4 archive URLs remain supported for those consumers. Previously
shared /docs/regions/ and /reference/region.md links resolve to the new modular
Region reference. Their compatibility reason is external links; remove them when
those references migrate and access logs establish they are unused.
scripts/docs-sync/README.md describes the bounded
reading-copy sync and reviewed PR path. It preserves the imported archive and
rejects navigation changes. Changes to the canonical corpus require an explicit
complete snapshot import and website review. Neither import nor build authorizes
publication.
/case-studies/ lists studies from content/case-studies.mjs. Each article supplies
metadata, a conclusion, sections, disclosures, and methodology to the shared static
article layout. Add a study to that list to generate its route and index card.
The first article, /case-studies/realworld/, uses only the final five-app run at
00dc2c8e469f3d62470b1a63a66ff9892eb3fdff. Its compact metric data records that pin;
permanent links point to the raw evidence. Development prompts are transcribed from
the original chat, separately from repository evidence. The supplied brief is kept
verbatim in content/case-studies/realworld-brief.txt and displayed in a native,
closed-by-default disclosure. The rebalanced 1800 × 960 editorial illustration serves
as both hero and social image at its full aspect ratio; no crop or padding is needed.
Copied screenshots retain their source dimensions and link to their original captures.
Social metadata uses the canonical public paths; the loopback preview sends a noindex header.
The second article, /case-studies/roundingwell/, describes the migration through
RC2 and is drafted for publication after that application change merges. Its historical
beta.6 benchmark table reads the preserved CSV in
site/assets/case-studies/roundingwell/evidence/; that directory includes raw
samples, source pins, file hashes, and methodology. The worklist capture uses
synthetic data. The 1729 × 910 hero pairs the existing RoundingWell and Marionette
vector logos in blue and red panels. Its editable source is
site/assets/case-studies/roundingwell/brand-panels.svg; the PNG export is shared
by the article and social metadata without cropping.
The feature branch and pull request are the staging mechanism. News articles have
no draft flag: the normal build includes them in the feed, sitemap, and public
article metadata. They become public when the PR is merged and the deployment
workflow publishes that commit. A branch build does not authorize that merge.
The loopback preview independently sends X-Robots-Tag: noindex, nofollow for all
responses; the production 404 also remains noindexed.
Article dates are editorial publication dates. RoundingWell intentionally uses October 6, 2026, separately from its Git merge and deployment timestamps. The launch hero's lossless WebP derivative is used in-page; the original PNG is preserved for source and social previews, with unchanged artwork and dimensions.