Skip to content

docs: the external-systems guide gains the OData datasource section and the three-way choice (declarative OData, plugin driver, DataSync mirror) — epic #27261 P2 #27747

Closed

Description

@objectstack-fleet

epic:#27261#1 · marchtian · session_017ihL2c5z3q4h8inrn5kwqV
Filing gate: ③ maintainer-directed — 田騏 at 2026-10-29T21:58Z 「现在启动全部 P2」 (epic comment 6509296853, D1 amended), at 2026-10-29T21:59Z 「OData 驱动 只做 v4」 (6509311454), at 2026-10-29T22:01Z 「同意」 (generic P2 parts open source in this repository; vendor-specific drivers such as Salesforce stay out of it).
Ruling-ref: 6486145005 (#27299, Tier B = declarative OData) · 6486136301 (#27298, D7) · 6471382887 (#27261 D1–D6)
Dedupe (open AND closed): "OData datasource driver $metadata import connector credential external datasource" → 5 hits, none this work (#27298 is the ruled decision card).
Reader: the epic PM (#27261) dispatches it in the epic subtree.
Blocked-by: #27741
type: Feature

维护者速读

  • 做什么: 指南加一节:用 OData 声明式接入 SAP / Dynamics 365 的完整示例,以及什么时候该写插件驱动、什么时候该用 DataSync 同步成真表。
  • 需要您做的: 无。

Task

  • content/docs/data-modeling/virtual-objects.mdx (or a sibling page): an OData datasource + object binding example, pushdown and the floor explained, write gates, auth through credentialsRef and (once landed) a connector instance.
  • The three-way rule: OData endpoint available ⇒ declarative; no OData, computed rows or a private API ⇒ plugin driver; slow-changing reference data ⇒ real object + DataSync.
  • A note that Salesforce exposes no OData for its own data, so it takes a driver of its own.

Clause-②: no · Metadata-protocol: none.

Activity

  1. added
    enhancementNew feature or request
    domain:devxDomain lane — seat card indexed by label:pm:seat
    pm:epicReserved by a dedicated epic PM, parent or sub-issue; other PMs never take it; never with pm:queue
    on Oct 29, 2026
  2. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    epic:#27261#1 · marchtian · session_017ihL2c5z3q4h8inrn5kwqV
    Claim: PM loop round 11 2026-10-30T01:38Z
    Session: session_017ihL2c5z3q4h8inrn5kwqV (epic PM); implementing card thread session_017ihL2fzEsUhDQ2VCWQJ5eu
    Account: marchtian
    Branch: claude/project-thread-uz3qfd (the card thread's platform-assigned branch — measured platform exception to claude/issue-<n>-<slug>)
    Worktree: objectstack-issue-27747
    Domain: domain:devx
    Seat: epic:#27261#1 (epic PM; no domain:* seat). Maintainer order, 田騏 2026-10-29T21:58Z: 「现在启动全部 P2」 (ruling 6486145005, Tier B = declarative OData)
    File surface: content/docs/data-modeling/** (virtual-objects.mdx or a sibling page: the OData datasource section, the three-way choice, the Salesforce note), the docs nav/meta file a new page needs, packages/drivers/driver-odata/README.md (cross-link only) (stop on breach, including any skills/** or packages/spec/src/** edit; explain in the report)
    Container & model: S, mode:thread, model: default tier (dispatch-gates --tier: no path-derived mandate), effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: epic #27261 P2 (ruling 6486145005), unblocked by #27741 (PR #27796, 0a4b0fb223)
    Thread-read: none
    Premise: holds — on origin/main (0a4b0fb2) driver-odata is published, and no guide page shows an OData datasource or says when to choose declarative OData, a plugin driver, or a DataSync mirror.
    Serial constraints: auth through credentialsRef only. The external.connector mention belongs to #27786 (Blocked-by #27746); do not write it here. The pointer to #27744's conformance kit goes in this PR if #27798 is on main before this PR is ready; otherwise the epic PM moves it to #27786. Every example must parse against the schema on main.

  3. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    epic:#27261#1 · marchtian · session_017ihL2fzEsUhDQ2VCWQJ5eu
    os-dev-report

    {
     "issue": 27747,
     "status": "done",
     "branch": "claude/project-thread-uz3qfd",
     "pr": "https://github.com/objectstack-ai/objectstack/pull/27871",
     "head": "c62ec8e2",
     "session": "session_017ihL2fzEsUhDQ2VCWQJ5eu",
     "premise_still_valid": true,
     "summary": "New page content/docs/data-modeling/odata-datasources.mdx (check the service: v4 only, a key per entity set, auth; mount createODataDriverPlugin with its option table; an os:check datasource + object binding; credentials through external.credentialsRef only, bearer/basic/none, first-request resolve and 401 re-resolve, fail-closed; what the service is asked behind the floor, the never-narrower rule, nextLink paging, the 1000-row cap; writes by key with If-Match and the refusal mapping; the sharing-model choice; a failure table; what it does not do). virtual-objects.mdx: 'Virtual, or a real object?' becomes 'Which way in: OData, a plugin driver, or a real object' with the card's three rules in order, plus the Salesforce note (no OData for its own records, so a plugin driver over its REST API); the SAP example and See also point to the OData page. external-datasources.mdx callout and See also route OData v4 services there. Nav: meta.json, the module index block, scripts/docs-audit/handwritten-docs.json. driver-odata README: one cross-link, with a patch changeset. No external.connector mention, no conformance-kit pointer (#27798 not on main), per the Claim.",
     "tests": "No code changed. The os:check block parsed through defineStack from packages/spec/src (tsx) on main's schema; the mount example's options parsed through parseODataDriverConfig, and the four refusals the page names were each refused as described. Every claim read off driver-odata at 0a4b0fb2 (config, plugin, transport, filter, odata-driver, floor and conformance tests) and, for os serve, packages/cli/src/commands/serve.ts.",
     "gates": "dispatch-gates --commands derived 88 families (71 before the changeset, index row and audit-scope row); all run, exit codes recorded before any pipe. First pass red: check-section-landing-index and check:docs-audit-scope (new page not listed), both fixed; check:skill-examples, check:dual-build-cjs-loads, check:lean-entry-closure exit 3 until ./packages/** was built. Final --ran: 88 derived, 88 run, 0 NOT-MEASURED (a DERIVED zero). origin/main merged at c62ec8e2 (12 commits, none on these files); doc-anchors, section-landing-index, docs-audit-scope green after. PR check-runs at report time: 23 listed, 3 skipped, 20 in_progress, 0 failure.",
     "dogfood_battery": "n/a: docs-only, no ! in the title, Clause-② no",
     "mcp_calls": "github issue_read x3 (#27747 get, get_comments x2), pull_request_read x3 (#27798 get, #27783 get, #27871 get_check_runs), subscribe_pr_activity x1 (platform subscription); no MCP write tool",
     "api_writes": "2: relay pr_create (run 40991535965, PR #27871, body 7915 bytes read back identical, assignee marchtian); relay comment on #27747 (this report). git push is not a REST write.",
     "surface_note": "scripts/docs-audit/handwritten-docs.json and content/docs/data-modeling/index.mdx were edited because their gates require every new hand-written page to be listed (read as 'the nav/meta file a new page needs'); .changeset/27747-odata-guide-readme-link.md because the README ships in the package.",
     "open_questions": [
      {
       "question": "Is os serve's missing secret-store handoff to a stack's OData plugin a card, or does #27746's credential seam cover it?",
       "options": [
        "A: file a card (devx/runtime): os serve exposes its datasource secret resolver to stack plugins, e.g. as a kernel service the OData plugin reads when options.secrets is absent",
        "B: leave it; the external.connector path (#27746/#27786) is the supported route on os serve, and the page's own-resolve advice stands for credentialsRef"
       ],
       "recommendation": "A, because credentialsRef is the documented channel and on os serve a sys_secret handle minted by the Add Datasource wizard cannot reach the OData plugin today"
      }
     ],
     "out_of_scope_findings": [
      "carrier: epic PM · os serve builds its sys_secret binder inline (serve.ts) and passes it only to DatasourceAdminServicePlugin; no kernel service exposes it, so createODataDriverPlugin({ secrets }) on os serve cannot resolve a sys_secret: handle (documented on the page, not filed)",
      "carrier: #27786 · the conformance-kit pointer (virtual-objects.mdx step 3 and the OData page) once #27798 lands"
     ]
    }
  4. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    epic:#27261#1 · marchtian · session_017ihL2c5z3q4h8inrn5kwqV
    Landed · 2026-10-30T03:24Z

    PR #27871 merged through the queue as 6e53003828 on 2026-10-30T03:02:57Z (head c62ec8e2; seat ACCEPT 6513650694, the review of record for a no-contract-face PR). The guide gains data-modeling/odata-datasources.mdx, and virtual-objects.mdx opens with the three-way rule and the Salesforce note. Follow-ons: #27875 drops the os serve credential caveat; #27745 (PR #27880) rewrites the "$metadata" bullet; #27786 adds the external.connector and conformance-kit mentions.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:datadomain:devxDomain lane — seat card indexed by label:pm:seatenhancementNew feature or requestpm:epicReserved by a dedicated epic PM, parent or sub-issue; other PMs never take it; never with pm:queuepriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions