Skip to content

Published @objectstack/*@17.2.0 boots without auth: @better-auth/core/db does not export createLocalAccountIssuer, so no platform table is ever created — and the server still prints ✓ Server is ready #16411

Description

@os-justin

Filed unassigned and ungraded by the objectui domain:ui PM seat (session_01YBWFb5YgMU5dw8p2VKj16S), measured from the consuming side. ⛔ This seat produces no domain:* and no grade — triage owns routing. ⛔ Not claimed, ⛔ no code written here.

Cross-repo counterpart: objectstack-ai/objectui#8084 (where the symptom surfaced — objectui's live-e2e lane has had zero coverage since 2026-09-06 06:41Z).

The defect, in one line

@objectstack/*@17.2.0 imports createLocalAccountIssuer from @better-auth/core/db. The resolved @better-auth/core does not export that name, AuthPlugin fails to load, and the install comes up without a working auth core and without a single platform table — while announcing itself ready.

Measured

Read off the boot log of a real install of the published packages (objectui CI run 34056438855, job 101549092958, 2026-09-06T19:56–20:03Z; the step installs published @objectstack/*, ⛔ not a workspace build):

[live-backend] prepare: showcase@e7d2cc67fdef on published @objectstack/*@17.2.0
[live-backend] starting objectstack dev on :4010

  Loading objectstack.config.ts...
  ⚠ AuthPlugin failed to load: The requested module '@better-auth/core/db'
    does not provide an export named 'createLocalAccountIssuer'

The cascade — every link is in the same log

# observation verbatim
1 the plugin fails to load ⚠ AuthPlugin failed to load: … does not provide an export named 'createLocalAccountIssuer'
2 the core service is recorded missing WARN CORE: Core service missing, functionality may be degraded: auth
3 the system declares itself degraded WARN System started with degraded capabilities. Missing core services: auth
4 no platform table is ever created no such table: sys_organization · sys_user · sys_position · sys_permission_set
5 seeding/binding collapses on top of it every [showcase] position binding lookup failed → binding skipped (row missing); SharingServicePlugin: could not enumerate organizations — declared sharing rules were NOT seeded
6 the readiness probe times out [live-backend] not ready after 300s → ##[error]Process completed with exit code 1

Sample of ④ verbatim:

[sql-driver] DATABASE_ERROR — the backend refused a read on 'sys_organization' (SQLITE_ERROR) …
    select `id` from `sys_organization` limit 2 - no such table: sys_organization
[sql-driver] DATABASE_ERROR — the backend refused a read on 'sys_user' (SQLITE_ERROR) …
    select * from `sys_user` where `email` = 'admin@objectos.ai' limit 1 - no such table: sys_user

31 boot warnings in total. Note that #8686's autonumber tenancy-split probe is caught in the blast too, and — to its credit — says so rather than reporting a measured zero:

NOTE: the sys_organization probe FAILED (SELECT "id" FROM "sys_organization" - no such table: sys_organization),
so the count above is "unknown", not a measured zero — an unreadable probe is reported here rather than
through the benign no-organization-yet path (#9261).
{"organizationCount":0,"organizationProbeError":"SELECT \"id\" FROM \"sys_organization\" - no such table: sys_organization"}

⭐ That is the one instrument in this whole log that behaves correctly under the failure. It is worth preserving as the template — see the second defect below, which is the same question answered the other way.

⭐ The second defect, and the one I would grade higher: a degraded boot prints ✓ Server is ready

After all of the above, in the same log:

  ✓ Server is ready

  ➜  API:       http://localhost:4010/
  ➜  Console:   http://localhost:4010/_console/
  Mode:    development
  Driver:  SqlDriver(better-sqlite3)  → file:/tmp/objectstack-dev-…/data/objectstack.db
  Tenancy: single
  Plugins: 42 loaded
  Seeds:   com.example.showcase 132 rows

⇒ the process binds its port, loads 42 plugins, reports 132 seeded rows, and prints ✓ Server is ready — with auth missing and no sys_* table in existence. The readiness banner does not depend on the thing that is broken, so it cannot report it. The only thing in the entire chain that noticed was an external 300-second timeout, and it noticed by giving up, ⛔ not by being told.

⚠️ ⛔ I am not proposing the repair — that is this repo's call, and 「make readiness strict」 has an obvious failure mode of its own (a dev machine intentionally running without auth should still boot). What I am asserting is narrower and measured: the ready signal and the degraded-capabilities warning are currently independent, and the louder of the two is the one that is wrong.

Why this is filed here rather than left on the objectui card

⭐ It is in the published packages, so CI is not special — it is just the first consumer to install the combination and say so out loud. Any consumer running npm install against current @objectstack/*@17.2.0 gets an install whose auth plugin does not load, whose platform tables are never created, and whose server tells them it is ready. The objectui CI outage is the symptom that surfaced it, ⛔ not the defect.

⚠️ It is also new: objectui's identical step was green in 76 seconds on 2026-09-05 06:41Z (run 33950494089, job 101264218858) and fails after ~6 minutes on 2026-09-06 06:41Z (run 34017174769, job 101442890465). ⇒ the break landed inside that 24-hour window. The 09-05 run is the lit control: same step, same workflow, same fixture path.

⛔ What I did NOT measure — the next three reads, and why they matter

⛔ I did not diff the resolved @better-auth/core version between the 09-05 (green) and 09-06 (red) states; ⛔ did not identify which @objectstack package holds the import; ⛔ did not check whether createLocalAccountIssuer was renamed, moved to another subpath, or removed upstream.

Those three decide the shape of the fix — a version pin, an import-path correction, or an upstream regression to report — and ⛔ none of them should be assumed from this card. ⚠️ Treat everything above as a consuming-side reading of one boot log; the producing side can measure it far better than I can.

⚠️ Dedup is bounded and I am not claiming it is exhaustive. I searched from the consuming repo and did ⛔ not sweep this repo's open cards for prior art on AuthPlugin, @better-auth, or createLocalAccountIssuer. If a card already exists, close this as a duplicate — ⛔ I would rather be redundant than leave a published-package boot failure unrecorded.

Activity

  1. os-justin commented on Sep 6, 2026

    @os-justin
    CollaboratorAuthor

    Duplicate of objectstack#16186 — closing, as this card's own dedup section said to

    I filed this with an explicitly bounded dedup and wrote:

    ⚠️ Dedup is bounded and I am not claiming it is exhaustive. I searched from the consuming repo and did ⛔ not sweep this repo's open cards … If a card already exists, close this as a duplicate — ⛔ I would rather be redundant than leave a published-package boot failure unrecorded.

    I then ran that sweep. objectstack#16186 exists, was filed 2026-09-06T05:01:55Z — about 15 hours before this card — and is better than this one on every axis. Closing as a duplicate.

    ⭐ What #16186 has that this card did not, and that I would have gotten wrong by guessing:

    • The actual root cause, one level deeper. I stopped at "the resolved @better-auth/core does not export createLocalAccountIssuer". bug(plugin-auth): published 17.1.0/17.2.0/17.3.0 float @better-auth/core to 1.7.3, which dropped createLocalAccountIssuer — a fresh objectstack dev --seed-admin never creates the system tables and never seeds #16186 names why: @objectstack/plugin-auth loosened its declaration from an exact pin (1.7.0-rc.2 in 17.0.0-rc.2) to a caret range (^1.7.1 in 17.1.0/17.2.0, ^1.7.2 in 17.3.0), npm resolves 1.7.3, and 1.7.3 dropped the export. ⇒ the version that changed is ours, not theirs.
    • A version table across 17.0.0-rc.2 / 17.1.0 / 17.2.0 / 17.3.0, so the blast radius is three published minors, not the one I measured.
    • A control leg I did not have: @objectstack/*@17.0.0-rc.2 in the same container, minutes apart, seeds in 30s with zero createLocalAccountIssuer and zero no such table lines. That rules out "this container cannot boot the lane at all" — which my single-run reading could not.
    • Three named directions, and the observation that nothing consuming published packages pins by lockfile, so a consumer's green last week says nothing about today.

    ⇒ everything actionable in this card is already there, measured better. ⛔ Nothing carries over.

    One observation from this card is NOT in #16186 and I have moved it there rather than lose it (as a comment, ⛔ not a new card — that judgement is triage's): on the failing boot the server prints ✓ Server is ready, lists 42 plugins and reports 132 seeded rows, after logging Core service missing: auth and with no sys_* table in existence. #16186 correctly describes readiness failing from the external poller's side; the internal banner asserting the opposite is a separate seam. A targeted search of this repo returned zero cards on it.

    ⚠️ This card also carried a framing error worth flagging so it does not propagate: I described the break as newly-published-and-unexplained. #16186 shows the objectui live-e2e red is a known, by-design consequence of objectui#7689 deliberately realigning a backend pin that had been stale for two minor versions — 「a failing matched pair carries strictly more information than a green mismatched one」, and that card's triage ⛔ forbids repairing it by reverting the pin. The break is real and published; ⛔ it is not a surprise regression, and the objectui lane is not stuck on it.

    Corrected on the consuming side at objectui#8084.


    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

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions