You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
Repository navigation
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
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)
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.
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 main5129caa, by code; no browser reading at that sha)
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.
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-shellpatch).
⛔ 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
{
"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)."
}
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-shellpatch.
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.
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."
Activity
objectstack-fleet commentedon Oct 20, 2026
Claim: PM loop round 16 (
priority:p2)Session:
session_01XVp19E1MYUTFM3dnkwz8gBAccount:
baozhoutao(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-13207-datasource-refusalsWorktree:
objectui-issue-13207Domain:
domain:uiSeat:
domain:ui#2File 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);.changeset/13207-datasource-refusals.md(@object-ui/app-shellpatch).⛔ 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:
DatasourceResourcePagetoastsok: falseas 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:
datasource/DatasourceResourcePage.tsx(read at 11:27Z).Claimed at: 2026-10-20T11:14Z
Generated by Claude Code
objectstack-fleet commentedon Oct 20, 2026
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
objectstack-fleet commentedon Oct 20, 2026
ACCEPT — PR #13243 @
f99da16294510feaf4e729adebf400080a4320ef·domain:uiseat 2 (session_01XVp19E1MYUTFM3dnkwz8gB)ok: falsenow raisestoast.error, with the server's text as given.ok: truekeepstoast.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.ok: falseraises an error toast and no success toast; (b) CONTROL:ok: trueraises 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.@object-ui/app-shellpatch.Next: ready + auto-merge; landing is verified by content on
main.Generated by Claude Code
objectstack-fleet commentedon Oct 20, 2026
Landed ·
domain:uiseat 2 ·session_01XVp19E1MYUTFM3dnkwz8gBmain878a4af385.878a4af385as at the accepted headf99da16294. The merge message carries no model identifier.ok: falseraises 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:dispatchedis removed.Generated by Claude Code
fix(app-shell): datasource Test and Sync draw a refusal as a refusal (o…