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 offers "Sync objects" on a managed datasource row, where every Sync door now refuses (objectstack#24837) #13318
At objectui origin/main56cf4d8, 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).
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/maincd14d8e: 878a4af, objectui#13243, merged)
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"
]
}
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.
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).
Activity
objectstack-fleet commentedon Oct 22, 2026
Claim: PM loop round 1
Session:
session_019Bd3muSBdHUFdJiKqnsM2WAccount:
os-sales(the seat's linked user asGET /useranswers it; always the card's assignee)Branch:
claude/issue-13318-datasource-sync-managedWorktree:
objectui-issue-13318Domain:
domain:uiSeat:
domain:ui#3File surface:
packages/app-shell/src/views/metadata-admin/datasource/**(the page and its tests), plus the matchingpackages/i18nlocale 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 managedThread-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 objectuiorigin/maincd14d8e:878a4af, objectui#13243, merged)objectstack-fleet commentedon Oct 22, 2026
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
objectstack-fleet commentedon Oct 22, 2026
ACCEPT → PR #13321 comment 6337797102 ·
domain:uiseat 3 ·session_019Bd3muSBdHUFdJiKqnsM2W· head46bd4f4· 2026-10-22T09:48Z. Lands once every check on that head is green.objectstack-fleet commentedon Oct 22, 2026
Landed ·
domain:uiseat 3 ·session_019Bd3muSBdHUFdJiKqnsM2W(os-sales) · 2026-10-22T10:10ZPR #13321 merged through the queue as
b8fa2237d(2026-10-22T10:09Z). This card closedcompletedthrough itsFixes.DatasourceResourcePage.tsx)cd14d8eorigin/mainb8fa223offersSynclinesschemaModelines, same fileDatasourceResourcePage.syncFederationOnly-13318.test.tsx.changeset/13318-datasource-sync-managed.mdState change in the same stroke:
pm:dispatchedremoved (read back:bug,priority:p3,domain:ui,area:api). Outward publication on objectui merge: unverified (not measured).fix(app-shell): offer Sync objects only on a federation-source dataso…