Skip to content

fix(service-datasource): Setup → Datasources: Test answers truthfully for the primary datasource and for drivers that cannot introspect; Sync on the primary datasource refuses with the true reason - #24852

Merged
objectstack-fleet[bot] merged 4 commits into
mainfrom
claude/issue-24772-default-datasource-status
Oct 20, 2026

Conversation

@objectstack-fleet

@objectstack-fleet objectstack-fleet Bot commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

Fixes #24772
Clause-②: yes (widening)

What was wrong

Setup → Datasources listed the primary datasource as default · sqlite · connected, and that is true. DefaultDatasourcePlugin connects it through DatasourceConnectionService with asDefault, and ADR-0062 registers its driver under the driver's own name (com.objectstack.driver.sql), not under default. Test and Sync then introspected by the name default. The engine's registry has no entry by that name, so both answered [ObjectQL] Datasource 'default' has no registered driver to introspect.: Test as 200 { ok: false }, Sync as 400 EXTERNAL_DATASOURCE_ERROR. A connected memory datasource got the same ok: false from Test, because Test was an introspection round trip and that driver has no introspectSchema.

Measured before the change, on origin/main c3a8e07b6, through the real admin routes over a real ObjectQL engine, the real connection service and the real ExternalDatasourceServicePlugin:

POST /api/v1/datasources/default/test          -> 200 {"ok":false,"error":"[ObjectQL] Datasource 'default' has no registered driver to introspect."}
GET  /api/v1/datasources/default/remote-tables -> 400 EXTERNAL_DATASOURCE_ERROR, same message
POST /api/v1/datasources/qa_ram/test (memory)  -> 200 {"ok":false,"error":"[ObjectQL] Driver for datasource 'qa_ram' does not support introspectSchema()."}
admin list                                     -> default status "ok", qa_ram status "ok"

What changed (route D, as the seat ruled, comment 6287770114)

All of it is in packages/services/service-datasource/src. Nothing in packages/objectql.

  • One resolver, reused. registeredDriverName() in datasource-connection-service.ts is the default-driver resolver DatasourceConnectionService.disconnect() applied inline. It is extracted, and disconnect() calls it with its own asDefault flag, so its behaviour is unchanged. The Test path calls the same function. disconnectAll() names the reserved datasource through the same constant.
  • Test, POST /api/v1/datasources/:name/test. The plugin wires a new optional liveDriver seam: the engine's registry entry under the name registeredDriverName() resolves. testConnection() then:
    • for the primary datasource, answers the driver's checkHealth(), giving { ok: true, latencyMs }, and does not introspect the platform database;
    • for a driver with no introspectSchema (memory, mongodb), answers checkHealth() with the answer's existing keys, { ok: true, latencyMs } and no tableCount, instead of ok: false;
    • for a registered driver whose health check fails, answers ok: false with a reason;
    • for every other datasource, and for one with no live driver, runs the same introspection round trip as before, with the same tableCount and the same engine message.
  • Sync on the primary datasource. listRemoteTables, generateObjectDraft, importObject and refreshCatalog refuse default before any introspection. The status and code are the ones each door served before: 400 EXTERNAL_DATASOURCE_ERROR, or EXTERNAL_IMPORT_ERROR on the import. The message is now the true reason: Datasource 'default' is the platform's managed primary datasource, not a federation source: its tables are the platform's own objects, so there are no remote tables to list, draft or import from it. Sync objects from an external datasource instead.

The measured choice for Test on default: checkHealth(), not introspection by the resolved name

Both reach the live driver. checkHealth() was chosen for three reasons:

  • Introspection costs a round trip per table of the platform database. Measured with the real SqlDriver on SQLite in memory: introspectSchema() took 14.0 ms at 10 tables and 132.0 ms at 120 tables. checkHealth() took 0.79 ms and 0.28 ms. On a networked Postgres, each of those per-table round trips also pays the network latency.
  • The connection question is what Test asks, and checkHealth() is that question (SELECT 1 on SQL, ping on MongoDB).
  • The primary datasource is not a federation source, so a tableCount of the platform's tables answers nothing the page uses. No consumer in either repository reads tableCount.

Every other datasource keeps the introspection probe and its tableCount, so nothing moves for a federation source.

The seat's premises, re-checked before editing

  • P1, holds. The resolver disconnect() applied (opts.asDefault ? engine.getDefaultDriverName() : name) needs only getDefaultDriverName and getDriverByName. Both are on the 'data' engine's published contract (IDataEngine, packages/spec/src/contracts/data-engine.ts), which the plugin already reads. No objectql change is needed.
  • P2, holds. The Setup driver catalog (driver-catalog.ts) lists memory, sqlite, postgres, mysql and mongodb. The two without introspectSchema have checkHealth(): MemoryDriver.checkHealth() returns true, and MongoDBDriver.checkHealth() runs db.command({ ping: 1 }). IDataDriver declares checkHealth() as required.

Evidence after the change

packages/services/service-datasource/src/__tests__/primary-datasource-test-and-sync.test.ts has 10 cases. They run through the real composition: a real ObjectQL engine (its source, through this package's vitest alias), the connection service connecting default with asDefault exactly as DefaultDatasourcePlugin.init() does, the plugin's real wiring, and the admin routes over Hono.

  • On default, the list reads ok, and Test answers 200 { ok: true, latencyMs } with no error and no tableCount. The driver's introspectSchema is never called.
  • On default, remote-tables and object-draft answer 400, with error.code EXTERNAL_DATASOURCE_ERROR and the true message. The import refuses with { code: 'EXTERNAL_IMPORT_ERROR', status: 400 }, and the list and catalog refresh with { code: 'EXTERNAL_DATASOURCE_ERROR', status: 400 }. The platform database is never introspected.
  • A memory datasource tests { ok: true, latencyMs }, exactly those two keys. A registered driver whose health check answers false or throws gives ok: false.
  • Preservation: a managed runtime SQLite datasource still tests { ok: true, tableCount: 1 } and still lists its tables with 200. That is the seat's ban on changing Sync for other managed datasources. Sync on memory still refuses with the engine's reason. A datasource with no live driver still answers ok: false.

Ablations, one behaviour each. Each was run through scripts/ablation-replace.mjs: the anchor hit once, the on-disk blob changed, and the restore was proven blob == HEAD with an empty git diff HEAD. The subject is this package's own source, imported relatively, so no build sits between the mutation and the reading.

leg mutation reading
A1 the Test path looks the driver up by the datasource name, not through registeredDriverName red, 1 failed: expected { ok: false, …(1) } to match object { ok: true }
A2 route A put back: no primary guard on listRemoteTables, and introspection resolves the default red, 2 failed: expected 200 to be 400, and listRemoteTables('default') resolved a value
A3 a driver without introspectSchema goes back to the introspection round trip red, 2 failed: expected { ok: false, …(1) } to match object { ok: true } (re-run at 3226d4019)
A4 Test on default introspects by the resolved name red, 1 failed: expected [ 'latencyMs', 'ok', 'tableCount' ] to deeply equal [ 'latencyMs', 'ok' ] (re-run at 3226d4019)
A5 a failed health check is ignored red, 1 failed: expected true to be false
A6 the dropped introspection key put back on a driver that cannot introspect red, 1 failed: expected [ 'introspection', 'latencyMs', 'ok' ] to deeply equal [ 'latencyMs', 'ok' ] (at 3226d4019)

The published-surface addition: Clause-② yes (widening)

ExternalDatasourceServiceConfig is exported from the package's . entry, so its new optional member liveDriver widens the published surface. The changeset is a minor bump that declares Clause-②: yes (widening) and names that member. No status code, error code or accepted value moves on any route. Test's answer keeps its existing keys (ok, latencyMs, tableCount, error): the introspection key from the first head was dropped, because nothing reads it.

  • ExternalDatasourceServiceConfig.liveDriver?: a host that builds the service without it keeps the old probe.

registeredDriverName and DEFAULT_DATASOURCE_NAME are module exports only, not exported from the package entry.

Acceptance notes

  • refreshCatalog is included under the bounded in-place exemption. It is the same defect class (the same false "no registered driver" answer for default), in the same file, through the same refusal helper. Its door (POST …/external/refresh-catalog) keeps 400 EXTERNAL_DATASOURCE_ERROR.
  • A boundary, checked by reading the code. The refusal is keyed on the host-reserved name default (ADR-0062). The only way to register a driver literally named default is ObjectQL.create({ datasources: { default: driverWithNoName } }). A repository grep finds no production caller of ObjectQL.create, and every in-tree driver carries its own name. So no in-tree composition answered 200 on Sync for default before this change.
  • The card's "no edit or delete" is by design, not a defect. The tester's own 38-integrations-datasources-created.png shows Edit and Delete on the runtime qa_mem row. Only the code-origin default row lacks them: code-defined datasources are read-only (datasource-admin-service.ts header), and objectui hides both on origin: 'code'.
  • Not in this PR, per the ruling. ObjectQL.introspectDatasource still does not apply ADR-0062 (no objectql edit). Sync on other managed runtime datasources is unchanged (route B, filed separately by the seat). The two objectui renderer findings are filed by the seat.
  • Noted, not filed: the draft probe discards the answer of checkHealth(). DatasourceAdminServicePlugin.probe, behind POST /api/v1/datasources/test, awaits driver.checkHealth() and ignores the boolean it returns, so a draft whose driver's health check answers false would report ok: true. This comes from reading the code only: no public-door reading was taken.

Verification

At HEAD 3226d4019 (no further merge of origin/main: no conflict and no main-caused red, AGENTS.md §10):

  • pnpm --filter '@objectstack/service-datasource^...' build: exit 0.
  • pnpm --filter @objectstack/service-datasource build: exit 0, and check-dts-emitted reports 4/4.
  • pnpm --filter @objectstack/service-datasource typecheck: exit 0. --listFiles includes the new test file.
  • pnpm --filter @objectstack/service-datasource test: 48 files, 862 tests passed, 47.6 s.
  • Gate families from node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack (69 commands): 68 exited 0 and 1 was not measured. pnpm check:dual-build-cjs-loads exited 3 (PREREQUISITE NOT MET: it reads every package's built output, and this worktree builds only this package's closure), so CI's Lint & Repo Gates is its reading. --ran reconciliation: 69 derived, 68 run, 1 NOT-MEASURED, 0 UNRUN, with an exit code on every line. node scripts/check-platform-checklist.mjs is not owed: no exported symbol is renamed or deleted.

test:repo was not run locally. CI owns it, and this diff touches no test of that project.


Generated by Claude Code

…river; Sync refuses it with the true reason

The Datasources page read the primary datasource as connected (true: its
driver is live under its natural name, ADR-0062), while Test answered
ok:false and Sync 400, both saying it had no registered driver.

- registeredDriverName(): the default-driver resolver disconnect() applied,
  extracted so the Test probe reuses it instead of restating it.
- testConnection(): with a liveDriver wired, the primary datasource and a
  driver without introspectSchema (memory, mongodb) answer checkHealth();
  the latter says introspection: 'unsupported'. Every other datasource is
  tested as before.
- listRemoteTables / generateObjectDraft / importObject / refreshCatalog
  refuse the primary datasource with the same 400 and code as before, and a
  true reason: it is the platform's managed storage, not a federation
  source (ADR-0015 section 1).

Claude-Session: https://claude.ai/code/session_01UmqzD97e14iws6hmVhgZ5y
Co-authored-by: Claude <noreply@anthropic.com>
… and on a driver that cannot introspect

Through the real composition: a real ObjectQL engine, the connection
service connecting the primary datasource asDefault, the federation
plugin's wiring and the admin routes over Hono. Plus the patch changeset.

Claude-Session: https://claude.ai/code/session_01UmqzD97e14iws6hmVhgZ5y
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions github-actions Bot added size/m documentation Improvements or additions to documentation tests tooling labels Oct 20, 2026
@github-actions

github-actions Bot commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 1 package(s): @objectstack/service-datasource, touching 24 documentable anchor(s).

1 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:

  • content/docs/kernel/contracts/data-engine.mdx (via getDefaultDriverName (literal, a string literal in registeredDriverName))

⛔ 2 release-owned page(s) also name something this change touched. These are read-only:

  • content/docs/releases/v17/17-2.mdx (via introspectSchema (literal, a string literal in liveDriver), datasources.external.draft (sdk, the route ledger binds it to POST /api/v1/datasources/:name/external/tables/:remote/draft, selected by route anchor /tables/:remote/draft), datasources.external.import (sdk, the route ledger binds it to POST /api/v1/datasources/:name/external/tables/:remote/import, selected by route anchor /tables/:remote/import), /tables/:remote/draft (route, bridged from symbol generateObjectDraft — its route source's handler names it), /tables/:remote/import (route, bridged from symbol importObject — its route source's handler names it))
  • content/docs/releases/v17/17-7.mdx (via EXTERNAL_IMPORT_ERROR (literal, a string literal in importObject; a string literal in primaryDatasourceNotFederatedError))

content/docs/releases/ is RELEASE-OWNED (AGENTS.md "Documentation Guardrails"): release
notes are written centrally at release time, and a code PR that edits them is the exact PR
that guardrail exists to stop. They are still audited — read-only. If one of them is actually
wrong, file an issue or open a dedicated docs-only PR; do not edit it here.

What this run could not see
  • 1 name(s) were too generic to anchor anything (single lowercase words)
  • the SDK route bridge reached 54 of 206 client-bound route-ledger rows — the other 152 have no registrar path: tail to select them, so pages documenting THEIR client methods cannot appear above, on this or any run. Of those 152: 0 are remediable by widening that discovery convention (an in-repo file declares the path; the convention did not scan it); 55 are structural — on a ledger where NOT ONE row is declared in-repo, so no discovery change reaches them at any price; 97 are undecided (no in-repo declaration, on a ledger that has other in-repo registrars — absence and an unreadable spelling are not distinguishable here). The rows themselves: node scripts/docs-audit/affected-docs.mjs --bridge-coverage
  • a page that states a rule by its inputs shares no identifier with the emitter that implements the rule, so an emitter-only diff cannot list it — not on this run and not on any run. Measured on fix(driver-sql): emit varchar(maxLength) for a text field a declared index keys on #11430: content/docs/protocol/objectql/types.mdx documents the text-family column mapping by the ObjectQL type names it maps FROM (text / textarea / html) while the diff changed createColumn; it went unlisted, and it was the page that diff falsified, in four places. No shared token exists to detect this on, so a rule your change carries has to be re-read by hand in the pages that restate it.
  • a key NAME is not a key, so the hand re-read the line above prescribes can land on the wrong schema. The same spelling is authorable on one governed type and a [REMOVED] tombstone on another for each of active, aria, joins, objects, template, tools and version (censused on [finding] tools is a key on BOTH AgentSchema (tombstoned, dead) and SkillSchema (live, cloud-attested), so a name-based search attributes skill examples to the agent key — it produced a false stop-the-line alarm on PR #19059 #19093 over the liveness ledger's governed types, top-level keys); nothing in a search result distinguishes the two, so a grep hit on a LIVE example reads as evidence about the DEAD key. Measured on fix(spec): the agent.tools liveness row says dead — it claimed live on a key the schema tombstoned #19059: content/docs/ai/agents.mdx was reported as contradicting the agent.tools tombstone over its tools: example at :161, which is inside the defineSkill({ block opened at :155 — the page was already correct. Settle ownership by PARSING the value against both schemas, never by the name: that literal PASSES SkillSchema, and as an AgentSchema it FAILS at tools with the tombstone prescription. ⛔ These names are not the whole class — a key retired through a .strict() guidance map leaves no tombstone in the walked shape and none of them here (tool.category, live as AIToolDefinition.category).

Coarse fallback — 2 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): node scripts/docs-audit/affected-docs.mjs --json 4be72813112e0f865f1890ba6540ae0a496a5664 → packageMentionDocs.

Which tree this was computed on

This run read content/docs from e4c8774b485a70e37a4df8a6cd8ae9506c61ffed — the merge of head 3226d40195bb25ed73a2bd81a428252b59c4159e into base 4be72813112e0f865f1890ba6540ae0a496a5664, which is what actions/checkout gives a pull_request run. Not the PR head.

A worktree cut from an older main holds a different content/docs, so re-deriving there can legitimately return a different list — that is a different tree, not a wrong row. To answer on the same tree:

# while this PR is open — GitHub drops the merge commit once it closes
git fetch origin e4c8774b485a70e37a4df8a6cd8ae9506c61ffed && git checkout e4c8774b485a70e37a4df8a6cd8ae9506c61ffed
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 4be72813112e0f865f1890ba6540ae0a496a5664 3226d40195bb25ed73a2bd81a428252b59c4159e && git checkout -B drift-repro 4be72813112e0f865f1890ba6540ae0a496a5664 && git merge --no-ff 3226d40195bb25ed73a2bd81a428252b59c4159e

node scripts/docs-audit/affected-docs.mjs --json 4be72813112e0f865f1890ba6540ae0a496a5664

⚠️ That checkout carried uncommitted changes, so the commit above does not fully identify what was read.

Advisory only, and a precision-first one (#9192): a page is listed because it names a
symbol, wire route or SDK method this diff touched — not because it mentions a changed
package. Each row says which anchor put it there, so a wrong row is reportable rather than
merely annoying. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs 4be72813112e0f865f1890ba6540ae0a496a5664 → pass the list as
args.docs, on the commit named under Which tree this was computed on.

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对

REWORK (patch round 1) · #24772 · domain:services seat 2 · os-support-ai · session_01UmqzD97e14iws6hmVhgZ5y · 2026-10-20T10:39Z · head 07aba4704a, claim 6287232559, under seat ruling 6287770114.

The route matches the ruling: the default driver is resolved by ADR-0062's rule through the one extracted resolver, Test answers its health check, Sync on default refuses with the true reason, there is no objectql edit, and other managed runtime datasources are unchanged and pinned. Two items are owed before ACCEPT:

  1. Clause-② is yes for this diff, not no. ExternalDatasourceServiceConfig is exported from the package's . entry (src/index.ts), so its new optional liveDriver member widens the published surface. lanes/spec.md: widening the accept set or the public surface, however small, is Clause-②; the ruling's expected no assumed no surface would move. liveDriver itself stays: it is the package's own idiom (the config is callback-based so the service stays kernel-free). The changeset declares Clause-②: yes with a minor bump for @objectstack/service-datasource, naming that member. The seat corrects the claim's line and the PR body's line, and writes the TIER_DEFAULT contract review on the new head.
  2. Drop the introspection: 'unsupported' key. It also widens the published answer type, and nothing reads it (the console's Test reads ok, error and latencyMs). Under the startup axis, a key with no consumer is not added. A health-probe ok with no tableCount is already a truthful answer for a driver that cannot introspect. This refines the ruling's "says introspection is not supported": no new key, and the pins follow.

The dev's out-of-scope note (the draft probe discards checkHealth()'s boolean) is an unmeasured code read: it goes to the PR's Acceptance notes, not filed.


Generated by Claude Code

…hangeset declares the liveDriver widening

A driver without introspectSchema answers its health probe as
{ ok, latencyMs } with no tableCount, like the primary datasource: the
`introspection` key is dropped, since nothing reads it. The changeset is a
minor bump with Clause-② yes, naming the one published-surface addition,
the optional ExternalDatasourceServiceConfig.liveDriver callback.

Claude-Session: https://claude.ai/code/session_01UmqzD97e14iws6hmVhgZ5y
Co-authored-by: Claude <noreply@anthropic.com>
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: TIER_DEFAULT
Head-sha: 3226d40195bb25ed73a2bd81a428252b59c4159e
Local-runs: none

The face is the Clause-②: yes declaration alone (no packages/spec/** file and no governed path in the committed tree), reviewed in-seat by the lane seat from the diff, the card, ruling 6287770114 and the head's check-runs.

① Derived judgments

  • Published surface widened by exactly one member: correct, and declared. ExternalDatasourceServiceConfig is exported from the package's . entry (src/index.ts, unchanged by this PR), and gains the optional liveDriver?: (datasource) => Pick<IDataDriver, 'checkHealth' | 'introspectSchema'> | undefined. A host that omits it gets the previous probe. Nothing existing is narrowed or renamed.
  • Not published: DEFAULT_DATASOURCE_NAME and registeredDriverName are new module exports of datasource-connection-service.ts. They are not re-exported from the entry (the PR does not touch index.ts), so they are outside the published surface.
  • The Test answer type is byte-identical to origin/main's. The first head's introspection key is gone. Values change only where the ruling ordered: default and a driver without introspectSchema answer the driver's health check ({ ok, latencyMs }), and a failed health check answers ok: false.
  • Refusals keep their status and code. Sync on default (remote-tables, object draft, catalog refresh) answers 400 EXTERNAL_DATASOURCE_ERROR, and the import answers EXTERNAL_IMPORT_ERROR, as before. Only the message changes, to the true reason. No accepted value moves, and Sync on every other datasource is unchanged (pinned).
  • No objectql edit and no new error code, per the ruling.

② Semver level

minor for @objectstack/service-datasource: an additive optional member on an exported interface. The changeset's Clause-②: yes (widening …) line names it.

③ Boundary flags

Implemented-by: claude/issue-24772-default-datasource-status
Reviewed-by: session_01UmqzD97e14iws6hmVhgZ5y

VERDICT: PASS


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对

ACCEPT · #24772 · domain:services seat 2 · os-support-ai · session_01UmqzD97e14iws6hmVhgZ5y · 2026-10-20T11:37Z · head 3226d40195, after patch round 1 (REWORK 6289043617), the review of record for claim 6287232559, under seat ruling 6287770114.

  1. Form:
    • The first line is Fixes #24772; the seat's grep of the body finds no other closing keyword beside an issue number.
    • Clause-②: yes (widening) at line start in the body (written by the seat from the dev's pr_body_edits) and in the changeset. The claim's line was corrected to yes (claim 6287232559, with a correction note).
    • One minor changeset for @objectstack/service-datasource.
    • 5 files, +451/−3, inside the claim's file surface. No packages/objectql/** and no packages/spec/**.
  2. Ruling and fix:
    • Route D as ruled. The default datasource's driver is resolved by ADR-0062's rule through the resolver extracted from DatasourceConnectionService.disconnect (reused, not copied). Test answers the health check, and a driver without introspectSchema answers its health check too. Sync, draft, import and catalog refresh on default refuse with the same status and code and the true reason. Sync on every other datasource is unchanged.
    • Both patch-round items are done. The introspection key is dropped, so the Test answer type equals origin/main's. liveDriver is declared as the published-surface addition.
    • Contract review of record: 6289966933 (TIER_DEFAULT, the declaration face, PASS) on this head.
    • Pins and ablation. Ten cases on a real ObjectQL, the connection service and the admin routes. Six ablation legs (A1–A6) are each red as predicted and restored to the HEAD blob, the changed ones re-run on 3226d4019.
  3. Gates:
    • CI on 3226d40195: 41 check-runs completed, 34 success, 7 skipped, 0 failed (read by the dev at report time; re-read by the seat before the flip).
    • Local: 69 derived, 68 run, 1 NOT-MEASURED (check:dual-build-cjs-loads, covered by CI's Lint & Repo Gates), 0 UNRUN.
    • Package suites: service-datasource 48 files, 862 tests; typecheck exit 0; check-dts-emitted 4/4.
  4. Accepted deviations:
    • refreshCatalog('default') refuses the same way. That is the same defect class, file and helper, and it is named in the PR body.
    • The docs-drift note names content/docs/kernel/contracts/data-engine.mdx (via getDefaultDriverName). The PR reuses that contract and does not change it, so no doc edit is owed.
  5. Out of scope: the draft-probe note is in the PR's Acceptance notes (code read, not filed). Route B is service-datasource: Sync (remote-tables, object draft, import) answers on a managed datasource, though ADR-0015 §4.2 reserves federation for datasources whose schemaMode is not managed #24837. The objectui renderer findings are 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." objectui#13207.
  6. Landing: ordinary queue landing. The flip waits for the seat's re-read of CI on this head after the body edit.

Generated by Claude Code

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 20, 2026 11:39
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 20, 2026 11:39
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 20, 2026
Merged via the queue into main with commit 6b9e6df Oct 20, 2026
49 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-24772-default-datasource-status branch October 20, 2026 12:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/m tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Setup → Datasources: the default datasource reads "connected" while its Test and Sync answer that no driver is registered

2 participants