Skip to content

v0.78.1 — System 8 routes 404 in production

  • Fixes GET /api/modules/system8/powers and /powers/tokens returning 404 in production, which broke Build Mode for System 8 characters. Nothing in this repo was wrong: the cause is a route in the system8 module, and v0.78.0's pin bump from 0.12.1 to 0.14.2 is what shipped it. router.get('/docs/*', …) (system8 0.13.0) is a wildcard under Express 4 and a PathError under Express 5, which this platform has run since v0.44.0. The throw happens while the route is being registered, so it does not fail one route — module evaluation fails, loadServerEntry catches the import(), logs failed to load server entry, and returns null. No router is mounted and every path under /api/modules/system8 falls through to Express's default 404. The module's own tests were green because its express devDependency was ^4.21.0 — a major production does not run — and no test had ever handed the router to an app.
  • Pins system8 0.14.3, which registers that route as a RegExp (identical in both Express majors, same req.params[0]), moves its express devDependency to ^5.1.0 to match the host, and adds routerMounts.test.ts — it mounts the real router on a real app and asserts all nine route families answer rather than falling through. Reverting the one-line fix fails it with the production error.
  • Verified against the built 0.14.3 package loaded the way the image loads it (Express 5, the module's own node_modules stripped so express resolves to the platform's): both reported requests return 200.
  • Known gap, not fixed here: a module whose server entry throws is skipped with a single console.error and is otherwise indistinguishable from one that never declared a router. This is the second production 404 with that shape — install-hosted-modules.sh documents the first, genai and its missing zod — and it stays invisible until someone reads container startup logs.