Skip to content

/_account/ is retired — four pages still send readers to a 404 #108

Closed

Description

@os-zhuang

Six lines across four pages document /_account/* as an HTTP surface. On CLI 17.0.0 every one of those URLs returns 404 {"error":"Not found"}. This is not a regression — the surface was deliberately retired under ADR-0048 — but the docs never followed, and one of the six is the first thing a quickstart reader is told to open.

Surfaced by #94, which stopped rather than fix its own line in passing (correctly — fixing one of six leaves the corpus telling two stories).

The six lines

File:line Text
content/docs/quickstart.mdx:47 ➜ Account: http://localhost:3000/_account/ (sample banner)
content/docs/quickstart.mdx:59 `
content/docs/quickstart.mdx:152 ➜ Account: http://localhost:3002/_account/ (sample banner)
content/docs/index.mdx:52 `
content/docs/build/marketplace.mdx:90 "if no account exists yet, register one at /_account/register"
content/docs/resources/glossary.mdx:206 "/_account/ (sign-in, registration, and account management)"

The three quickstart.mdx lines are #94's and land with it; the other three are this card's. Splitting them that way only because #94 is already scoped and claimed — the ruling below must be one ruling applied to all six.

Evidence that the surface is gone

Measured, on a server the #94 agent booted itself (@objectstack/cli@17.0.0, clean home, os start --port 3877):

  • 404 on /_account/register, /_account/, /_account/login, /_account/sign-in, /account/register
  • 200 on /_console/, /api/v1/health, /api/v1/ready; 302 / → location: /_console/
  • Control that makes the 404s meaningful: /_console/zzz-nonexistent-garbage also returns 200 — the console 200s are SPA fallback and prove nothing about any specific path. The /_account/ 404s matter precisely because nothing catches them.

Corroborated in objectstack@origin/main, read-only:

  • git grep -n "_account" -- 'packages/*/src' → zero hits. There is no mount to find.
  • packages/cli/src/commands/serve.ts:2230 — "ADR-0048 — the platform apps (Setup/Account) moved out of plugin-auth's manifest into their own one-app packages", loading ['@objectstack/account', 'createAccountAppPlugin'].

What replaces it — partly answered by source, partly not

packages/apps/account/src/index.ts is explicit, and answers more than the probes could:

Account is a console navigation-shell app (AppSchema) given a distinct package id (com.objectstack.account) so /apps/<packageId> (alias /apps/account) resolves to exactly this app.

(The package name @objectstack/account was previously held by a deprecated standalone account-portal SPA, now removed; this reclaims it for the console account app.)

So the answer splits in two, and only the first half is settled:

(a) Account self-service — settled. It is an app inside the UI at /_console/apps/account, exactly the shape #100 landed for Setup (/apps/setup inside the UI served at /_console/). Source-grounded, not inferred from a probe.

(b) Sign-in and registration — NOT settled, and this is the one that matters. The Account app is a navigation-shell app over auth objects; it is not obviously where an unauthenticated visitor lands. The shipped console bundle carries the literal route strings "/login" and "/register", and / 302s to /_console/, which suggests the flow is in-app, client-side, entered by opening the UI — but that is inference. It cannot be confirmed by probing, because SPA fallback 200s everything under /_console/ (see the control above). Confirm it from the console router source or an unauthenticated redirect trace before writing a URL into quickstart.mdx:59.

⛔ Do not write a /_console/login or /_console/register URL on the strength of a 200. That is the same mistake as the /health ruling on #88: a path that exists in a registration table is not the same thing as a live wire path, and there the disproof was in the file I was quoting.

If (b) turns out to have no stable URL, the honest fix for the quickstart row is to name the action rather than a link — "open the UI and register on first run" — not to invent one.

Also worth fixing while someone is in there

packages/apps/account/src/index.ts:17 still says "this package is NOT yet wired into the dev/serve plugin set — that boot-path switch lands separately." It is wired: serve.ts:2238 loads it and a live boot lists @objectstack/account among the 30 loaded plugins. Stale transitional comment in objectstack, not an objectos matter — worth a one-line card there.

Why one card and not four fixes

/_account/ is a URL contract that changed upstream. The docs' job is to track the contract, and the contract-first fix is one ruling on "what is the account surface now", applied everywhere — rather than four editors independently guessing and landing four spellings. #89/#100 just demonstrated the cost of the alternative: a rename that fixed the word in one place left the URL wrong in another. This is that same shape, one layer down.

Record the ruling in the glossary.mdx Surface entry and have the other pages agree with it, so the next agent reads it instead of re-deriving it from whichever page they happened to open.


Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions