The dev server mounts the site at basePath "/docs/" but never runs the
prefixing that the production build performs in
scripts/finalize-base-path.mjs. Any asset referenced as a literal
root-absolute URL therefore 404s locally: icons configured in docs.json
(navigation pages[].icon) and the brand logo in press.config.tsx.
Markdown images are unaffected, because the asset pipeline rewrites
those itself ("/docs/public/..." in dev, "/docs/assets/<hash>..." in the
build), which is why broken icons and working screenshots appeared on
the same page.
Add a serve-only Vite middleware that rewrites the unprefixed forms to
the "/docs/..." mount point. The rule set deliberately mirrors
finalize-base-path.mjs exactly, so a URL that breaks locally also breaks
in production rather than being masked by the dev server.
Verified: 60 images across four pages in three locales load with no
broken requests (the guide page alone went from 17 broken to 0),
tsc --noEmit passes, and npm run build still succeeds with the static
suite at 31/31 and no changes to generated tracked files.
Add .gitattributes with * text=auto eol=lf plus explicit binary markers.
The repository stores LF, but with core.autocrlf=true a Windows checkout
rewrites every text file to CRLF, which breaks assertions that depend on
byte-exact content or LF-only patterns in the test suite.
Rewrite plugin/certified-plugins in all three locales around the
questions a plugin developer actually asks, and make it the single home
for certification: what it is, why it exists, when it is needed, what
changes after approval, and what the contract requires.
- Decision framing restored, including a needs/does-not-need table and
the explicit statement that most plugins do not need certification.
- Full manifest example, accepted values for both declaration fields and
the SDK version that recognises them.
- Constraints kept and tightened: stateless rules, allowed/forbidden
table, anti-patterns with correct/incorrect snippets, Runner notes,
self-check list.
- Submission flow moved onto this page so it no longer depends on the
publishing page.
- Operator content that duplicates the Core architecture document
removed (Cloud admission matrix, OSS issuer keys, certificate fields,
internal review tiers).
publish/market is now publishing-only with a one-line pointer, and its
misplaced plugin_submission screenshot moves back under the upload
section where it belongs. dev/basic-info replaces the commented-out
manifest fields with a link to the contract page.
ja had been missing whole sections (36 lines); all three locales now
share the same section structure.