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: Setup → Datasources reports a failed Test in a green success toast, and turns a refused Sync into "No remote tables found on this datasource." #13207

Closed

Description

@objectstack-fleet

Filing gate ①, class (a): user-visible product defects with a public-door reproduction and named landings. Two positions of one family on one page: a refusal is drawn as success or as emptiness.

Reader (who acts): objectui triage routes it to the lane that owns packages/app-shell. Filed by domain:services seat 2 of objectstack-ai/objectstack (seat post objectstack-ai/objectstack#21118) · os-support-ai · session_01UmqzD97e14iws6hmVhgZ5y, from the dev's out-of-scope findings 2 and 3 on objectstack-ai/objectstack#24772 (report 6287715439). ⛔ Not a claim. Grade and lane are triage's.

What happens (the maintainer's HotCRM pass of 2026-10-20, objectstack-ai/hotcrm#2188, on @objectstack/* 18.0.0-next.5)

  1. Test. POST /api/v1/datasources/default/test answered 200 { ok: false, error: "[ObjectQL] Datasource 'default' has no registered driver to introspect." }. The page showed that failure text in a green success toast (check icon). Evidence: 38-integrations-datasources-test.png.
  2. Sync objects. GET /api/v1/datasources/default/remote-tables answered 400. The page showed an error toast and then a dialog reading "No remote tables found on this datasource.", so a refusal reads as an empty datasource. Evidence: 38-integrations-datasources-sync-objects.png.

objectstack-ai/objectstack#24772 makes those two server answers true (its seat ruling 6287770114). A Test that fails or a Sync that is refused can still happen on any datasource, and the page still draws them as success and as emptiness.

Where (read on objectui main 5129caa, by code; no browser reading at that sha)

packages/app-shell/src/views/metadata-admin/datasource/DatasourceResourcePage.tsx:

  • test() (around line 258) calls toast.success(...) for both ok: true and ok: false. The failure branch only changes the text.
  • openSync() (around lines 446–451) catches the refusal, raises toast.error(...), then setTables([]). The dialog's empty state then renders as if the datasource had no tables.

Expected: a failed Test reads as a failure. A refused Sync shows the refusal in the dialog (the ADR-0112 envelope's message), not the empty-datasource copy. ⛔ No server-meaning mapping in the console.

Dedupe

objectui, MCP search_issues, open and closed, "datasource Test success toast shows failure, Sync dialog No remote tables found after refused introspection": 1 hit, objectui#11628 (closed). That one is the External Datasource panel reading the raw envelope, a different component and cause. New.

Dedupe words: datasource Test success toast on failure; toast.success ok false; Sync objects empty state on error; No remote tables found refusal.


Generated by Claude Code

Activity

  1. added
    area:apiThe API a customer can call, and integrations — REST, connectors, webhooks, jobs
    bugSomething isn't working
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    and removed on Oct 20, 2026
  2. objectstack-fleet commented on Oct 20, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 16 (priority:p2)
    Session: session_01XVp19E1MYUTFM3dnkwz8gB
    Account: baozhoutao (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-13207-datasource-refusals
    Worktree: objectui-issue-13207
    Domain: domain:ui
    Seat: domain:ui#2
    File surface (one family on one page: a refusal drawn as success or as emptiness):

    • packages/app-shell/src/views/metadata-admin/datasource/DatasourceResourcePage.tsx (test() ~258, openSync() ~446–451, and the Sync dialog's body);
    • metadata-admin/i18n.ts (only if a new row is needed for a failed-test title, en and zh);
    • tests beside it;
    • one .changeset/13207-datasource-refusals.md (@object-ui/app-shell patch).

    ⛔ No server-meaning mapping in the console; no export moves. Stop on breach; explain in the report.
    Container & model: S, mode:subagent, model: opus (default tier; no path-derived mandate)
    Clause-②: no (internal page)
    Responsibility: DatasourceResourcePage toasts ok: false as success and turns a refused remote-tables read into an empty list | the ADR-0112 envelope's message and the page's existing error toast | every admin testing or syncing a datasource whose driver refuses (measured on HotCRM, 18.0.0-next.5)
    Thread-read: none
    Serial constraints cleared:

    • No open objectui PR touches datasource/DatasourceResourcePage.tsx (read at 11:27Z).
      Claimed at: 2026-10-20T11:14Z

    Generated by Claude Code

  3. objectstack-fleet commented on Oct 20, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
     "issue": 13207,
     "status": "done",
     "branch": "claude/issue-13207-datasource-refusals",
     "pr": "https://github.com/objectstack-ai/objectui/pull/13243",
     "session": "session_01XVp19E1MYUTFM3dnkwz8gB",
     "premise_still_valid": true,
     "summary": "Premise held on origin/main 599a8a54bc: test() called toast.success for ok:false, and openSync() raised toast.error then setTables([]), so the dialog drew the empty-datasource copy. Now ok:false raises toast.error with the server text as given (ok:true keeps toast.success; non-2xx unchanged), and a refused remote-tables read puts the envelope message into the open Sync dialog (role=alert) instead of the empty copy; the toast fires only when the dialog was closed (or a later introspection started) before the refusal arrived. No server-meaning mapping, no export, prop or i18n key added; changeset .changeset/13207-datasource-refusals.md (app-shell patch).",
     "tests": "HEAD f99da16294. Targeted vitest under lock: pnpm exec vitest run --maxWorkers=1 packages/app-shell/src/views/metadata-admin/datasource/ (the 3 files naming the page) -> Test Files 3 passed (3), Tests 23 passed (23), VERDICT command-exit 0. New file DatasourceResourcePage.refusals-13207.test.tsx pins (a)(b CONTROL)(c)(d CONTROL)(e closed-dialog toast). Ablation (fix committed, EXIT trap, src import so no dist leg): toast.success restored for ok:false and toast.error+setTables([]) restored on refusal; anchor counts 1,1 -> 0,0, marker 0 -> 2; run: Tests 2 failed | 3 passed (5), failures exactly (a) and (c); restore git checkout HEAD -- PATH, blob hash 95a55b9292 == HEAD blob, git diff HEAD empty. Closure build turbo run build --filter=@object-ui/app-shell^... --concurrency=2 exit 0; app-shell type-check (tsc --noEmit && tsc -p tsconfig.test.json) exit 0, new test present in --listFiles (1 hit). Lint narrowed: eslint --no-inline-config --format json on the 2 changed .tsx files -> 2 files, 0 errors, 2 warnings on untouched lines (no-explicit-any in api(), set-state-in-effect on the existing load effect); printed config has no parserOptions.project/projectService, so type-aware linting is off and the diff cannot move any untouched file verdict. Battery at f99da16294, 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, check-hand-rolled-comment-mask.mjs, check-changeset-fixed.mjs, check-changeset-presence.mjs. Declared to CI: full packages/app-shell/ vitest directory. CI: in_progress at report time.",
     "mcp_calls": "0",
     "api_writes": "2 relay writes + 3 git pushes: fleet-write dispatch pr_create (POST /repos/objectstack-ai/objectui/pulls draft + POST issues/13243/assignees, run 39416050758), post-stamped comment POST /repos/objectstack-ai/objectui/issues/13207/comments (this report); git push x3 (empty branch probe, 311d3bba4d, f99da16294). Labels: zero writes (objectui, dispatch named none).",
     "open_questions": [],
     "out_of_scope_findings": [],
     "gates": "see tests; check:spec-floors not run (not in the named battery)",
     "files_changed": [
      "packages/app-shell/src/views/metadata-admin/datasource/DatasourceResourcePage.tsx",
      "packages/app-shell/src/views/metadata-admin/datasource/DatasourceResourcePage.refusals-13207.test.tsx",
      ".changeset/13207-datasource-refusals.md"
     ],
     "deviations": "Second commit f99da16294 added a request counter so a stale refusal is not drawn into a dialog reopened for a later read; within the claimed file. i18n.ts untouched (no new row needed)."
    }

    Generated by Claude Code

  4. objectstack-fleet commented on Oct 20, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT — PR #13243 @ f99da16294510feaf4e729adebf400080a4320ef · domain:ui seat 2 (session_01XVp19E1MYUTFM3dnkwz8gB)

    • Clause-②: no. Internal page logic; no export, prop or i18n key added. No contract review is owed, and the seat read the report.
    • Seat review: Test with ok: false now raises toast.error, with the server's text as given. ok: true keeps toast.success, and non-2xx is unchanged. A refused remote-tables read puts the envelope's message into the open Sync dialog (role="alert") instead of the empty-datasource copy. The toast fires only when the dialog was closed, or a later read had started, before the refusal arrived. A request counter (f99da16294, within the claimed file) keeps a stale refusal out of a dialog reopened for a newer read. There is no server-meaning mapping.
    • Pins: (a) ok: false raises an error toast and no success toast; (b) CONTROL: ok: true raises success; (c) a 400 refusal shows its message in the dialog and no "No remote tables found"; (d) CONTROL: a successful empty read shows the empty copy; (e) a closed dialog falls back to the toast. The ablation turned exactly (a) and (c) red, and the restore was proven by blob. The page's three test files (23 tests) are green.
    • Changeset: @object-ui/app-shell patch.
    • CI: all 36 check-runs completed on the head, 33 passed and 3 skipped.
    • Path fork: no governed path. Seat landing.
    • Findings: none.

    Next: ready + auto-merge; landing is verified by content on main.


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 20, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · domain:ui seat 2 · session_01XVp19E1MYUTFM3dnkwz8gB

    • Merged: PR fix(app-shell): datasource Test and Sync draw a refusal as a refusal #13243 through the merge queue as main 878a4af385.
    • Verified by content: each of the 3 files the PR changes has the same blob at 878a4af385 as at the accepted head f99da16294. The merge message carries no model identifier.
    • Landed: a datasource Test answering ok: false raises an error toast with the server's text. A refused Sync shows the server's message in the Sync dialog instead of "No remote tables found on this datasource."

    pm:dispatched is removed.


    Generated by Claude Code

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

Metadata

Metadata

Assignees

Labels

area:apiThe API a customer can call, and integrations — REST, connectors, webhooks, jobsbugSomething isn't workingdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions