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 offers "Sync objects" on a managed datasource row, where every Sync door now refuses (objectstack#24837) #13318

Closed

Description

@objectstack-fleet

Filing gate ①: a user-visible defect with a named site. This is the console half of objectstack-ai/objectstack#24837 (route B), filed by the domain:services seat 2 (seat post objectstack-ai/objectstack#21118) at the landing of objectstack-ai/objectstack#25167 (merge commit 72a302a9d).

What happens

At objectui origin/main 56cf4d8, Setup → Datasources renders a "Sync objects" button on every datasource row (DatasourceResourcePage.tsx, the row actions at about :612), whatever the row's schemaMode. The list payload already carries schemaMode: the editor reads it as ds.schemaMode ?? 'managed' at about :343.

Every runtime datasource an administrator saves without choosing a mode is managed, and so is any datasource declared managed. On such a row the button opens the Sync dialog, and the dialog shows the server's refusal (drawn there since #13207). The page offers an action that cannot succeed on that row.

Expected

  • The Sync action is offered only on a row whose schemaMode is external or validate-only, read from the list payload the page already holds.
  • A missing schemaMode reads as managed: the spec's default, and the editor's own reading.
  • On a managed row nothing starts a Sync. If the row says anything, it names the remedy the server's refusal names: edit the datasource to schemaMode: 'external' (or 'validate-only') with its external settings.
  • The platform's default datasource offers no Sync either; the server already refuses it by name.
  • No new widget, dialog or hook: the existing button's visibility or disabled state, and the existing editor.

Pins

  • A row with no schemaMode, and a row with schemaMode: 'managed', show no enabled Sync. A row with external and a row with validate-only show it. The default row shows none.
  • CONTROL: on an external row, Sync still opens the dialog and lists remote tables.

Priority: p3. This is the consumer follow-up of a REST door narrowing, and the refusal message already names the rule and the remedy, so no user is left broken (a consumer card is p1 only when its absence breaks users).


Generated by Claude Code

Activity

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

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1
    Session: session_019Bd3muSBdHUFdJiKqnsM2W
    Account: os-sales (the seat's linked user as GET /user answers it; always the card's assignee)
    Branch: claude/issue-13318-datasource-sync-managed
    Worktree: objectui-issue-13318
    Domain: domain:ui
    Seat: domain:ui#3
    File surface: packages/app-shell/src/views/metadata-admin/datasource/** (the page and its tests), plus the matching packages/i18n locale keys only if the row needs remedy text; .changeset/13318-*.md (stop on breach; explain in the report)
    Container & model: M, mode:subagent, model: opus (default tier; dispatch-gates --tier --repo objectstack-ai/objectui: no path-derived mandate)
    Clause-②: no
    Responsibility: objectui's DatasourceResourcePage offers Sync on every row whatever its schemaMode | the platform path: every Sync door on a managed datasource answers 400 with the rule and remedy (objectstack-ai/objectstack#25167), so nothing breaks, the console just offers a doomed action | any administrator in Setup → Datasources, today: every runtime datasource saved without a mode is managed
    Thread-read: none
    Serial constraints cleared: none — no open PR or in-flight claim touches packages/app-shell/src/views/metadata-admin/datasource/** (last change on objectui origin/main cd14d8e: 878a4af, objectui#13243, merged)

  3. objectstack-fleet commented on Oct 22, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    {
    "issue": 13318,
    "status": "done",
    "branch": "claude/issue-13318-datasource-sync-managed",
    "pr": "#13321",
    "session": "session_019Bd3muSBdHUFdJiKqnsM2W",
    "premise_still_valid": true,
    "summary": "DatasourceResourcePage now renders the existing 'Sync objects' button only when offersSync(row) holds: the row's schemaMode from the GET /api/v1/datasources payload is 'external' or 'validate-only' (an allow-list, so a missing schemaMode offers none without a ?? fallback), and the row is not 'default'. Managed rows hide the button (no remedy text, so no i18n keys); the remedy stays the editor's Schema mode select. Landing site is the expected one (packages/app-shell datasource page). All three PM mechanism assumptions measured TRUE: (1) the button was unconditional in the row actions; (2) the list summary carries schemaMode on every row (DatasourceAdminService.listDatasources sets schemaMode: effective.schemaMode ?? 'managed'; DatasourceSummary.schemaMode is required) at the objectui pin 06cab4849 and at objectstack origin/main; (3) the server refuses 'default' by name in ExternalDatasourceService.assertFederationSource, and the pin does not need to move (merge-base --is-ancestor 72a302a9d origin/main exit 0). Card/PR assignee untouched by me; PR assignee os-sales set via pr_create.",
    "tests": "head 46bd4f4. (1) Under the lock: pnpm exec vitest run packages/app-shell/src/views/metadata-admin/datasource/ -> Test Files 4 passed (4), Tests 27 passed (27); VERDICT command-exit 0. (2) Narrowed app-shell set (datasource dir + packages/app-shell/src/tests/ + consoleToasterAnchor.ratchet-7482, unsavedEditsLeave.census-13253, expressionUser.mountSites.ratchet) -> Test Files 31 passed (31), Tests 488 passed (488); VERDICT command-exit 0. (3) Ablation (one run, behaviour changed): node objectstack/scripts/ablation-replace.mjs replaced '{offersSync(ds) && (' with '{true && (' (anchor x1->x0, replacement x0->x1, blob 1ef26d74d6e7->2c02bcdbca5f); pins (a) and (c) red, (b) and (d) green: Tests 2 failed | 25 passed; restored: blob after restore == HEAD blob 1ef26d74d6e7, git diff HEAD empty. No build/dist leg: the test imports the page by relative source path. New pin file DatasourceResourcePage.syncFederationOnly-13318.test.tsx (a) no-schemaMode + managed rows: no Sync; (b) external + validate-only: Sync; (c) default (declared external): no Sync; (d) CONTROL external row opens dialog, requests remote-tables, lists tables. Fixture triage: refusals-13207 suite's ROW changed managed -> external (managed was incidental).",
    "gates": "objectui families derived by hand from objectui package.json + .github/workflows/lint.yml (objectstack dispatch-gates refuses objectui). Local, exit codes captured before any pipe: pnpm --workspace-concurrency=2 --filter '@object-ui/app-shell^...' build => 0; pnpm --filter @object-ui/app-shell type-check (echoed 'tsc --noEmit && tsc -p tsconfig.test.json') => 0; tsc -p tsconfig.test.json --listFiles lists both touched datasource test files (first attempt without heap flag SIGABRT, rerun with 4096 heap => 0); eslint --no-inline-config packages/app-shell/src/views/metadata-admin/datasource/ => 0 (0 errors, 2 warnings on untouched lines: no-explicit-any on the api body, set-state-in-effect on the load effect); check-changeset-presence => 0; check-changeset-no-major => 0; check:new-line-citations => 0 (VERDICT 0 new citations); check:control-bytes => 0; check:test-path-roots => 0; check:vi-mock-specifiers => 0; check:vi-mock-inherit => 0; check:vi-mock-override-shape => 0; check:changeset-claims => 0; check:pending-changeset-literals => 0; check:spec-symbols => 0; check-governed-queue-guard --test (diff paths) => NOT GOVERNED. NOT run locally (CI's): repo-wide pnpm lint, repo-wide pnpm type-check, full pnpm test / full app-shell suite (1674 test files). CI on PR head 46bd4f4 at report time: 35 check-runs, 30 in_progress, 2 success, 3 skipped, 0 failed -- in_progress is the honest value; NOT MEASURED: CI conclusions.",
    "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm (claim says Clause-②: no)",
    "mcp_calls": "0",
    "api_writes": "2 relay strokes via scripts/pm/fleet-write/dispatch.mjs (each = POST /repos/objectstack-ai/objectstack/dispatches): (1) pr_create -> POST /repos/objectstack-ai/objectui/pulls (draft) + POST /repos//issues/13321/assignees [os-sales], read-back identical 5644/5644 bytes; (2) this os-dev-report comment -> POST /repos//issues/13318/comments. git push of the branch (not REST). Reads: unauthenticated REST GETs of issue 13318, its comments, pulls/13321 and its check-runs.",
    "line_budget": "n/a — no skills/** or governed ledger touched",
    "files_changed": [
    ".changeset/13318-datasource-sync-managed.md",
    "packages/app-shell/src/views/metadata-admin/datasource/DatasourceResourcePage.tsx",
    "packages/app-shell/src/views/metadata-admin/datasource/DatasourceResourcePage.refusals-13207.test.tsx",
    "packages/app-shell/src/views/metadata-admin/datasource/DatasourceResourcePage.syncFederationOnly-13318.test.tsx"
    ],
    "deviations": [
    "Dispatch asked for 'at least pnpm lint, pnpm type-check'; os-dev.md says the repo-wide scan (pnpm lint) is CI's and never owed locally. Ran the scoped forms instead (eslint --no-inline-config over the touched directory; app-shell type-check after building its dependency closure) and left repo-wide lint/type-check to CI. Conflict named, not silently chosen.",
    "Declared narrowing: a full app-shell vitest run (pnpm exec vitest run --maxWorkers=2 packages/app-shell/, 1674 test files) held the shared lock ~9 min with siblings queued and no output yet; I stopped it by its own process group (my PIDs only, no pkill) and ran the 31-file narrowed set above. Full suite left to CI.",
    "Commit trailer: wrote AGENTS.md's model-free pair (Claude-Session + 'Co-authored-by: Claude') instead of the harness reminder's model-named Co-Authored-By line; AGENTS.md takes precedence.",
    "PR footer: os-dev.md's session-URL 'Generated by Claude Code' form, not the harness reminder's emoji line."
    ],
    "open_questions": [],
    "out_of_scope_findings": [
    "carrier: 承接者:无 · noted, not filed · read-only inference, not reproduced: in the Sync dialog the checkbox state and the object-draft request key on the bare table name (selected.has(t.name), body { table }) while the row key is schema-qualified, so two remote tables of the same name in different allowed schemas would toggle together and draft ambiguously. Not in the PR's Acceptance notes (PR body written once); seat may add it. dedupe words: Sync dialog schema-qualified table name, remote tables same name two schemas, object-draft table schema"
    ]
    }


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 22, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT → PR #13321 comment 6337797102 · domain:ui seat 3 · session_019Bd3muSBdHUFdJiKqnsM2W · head 46bd4f4 · 2026-10-22T09:48Z. Lands once every check on that head is green.

  5. objectstack-fleet commented on Oct 22, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · domain:ui seat 3 · session_019Bd3muSBdHUFdJiKqnsM2W (os-sales) · 2026-10-22T10:10Z

    PR #13321 merged through the queue as b8fa2237d (2026-10-22T10:09Z). This card closed completed through its Fixes.

    reading (DatasourceResourcePage.tsx) base cd14d8e origin/main b8fa223
    offersSync lines 0 3
    control: schemaMode lines, same file 9 17
    DatasourceResourcePage.syncFederationOnly-13318.test.tsx absent present
    .changeset/13318-datasource-sync-managed.md absent present

    State change in the same stroke: pm:dispatched removed (read back: bug, priority:p3, domain:ui, area:api). Outward publication on objectui merge: unverified (not measured).

  6. added a commit that references this issue on Oct 28, 2026
    b8fa223
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:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions