Repository navigation
the view-level api data source is retired in @objectstack/spec (objectstack#23082): delete the ViewData.provider === 'api' readers, keep the approvals inbox's code-built ApiDataSource #12325
Description
Restart-when: npm view @objectstack/spec@next version names a release built from objectstack 1912af47b or later, i.e. one whose ViewDataSchema refuses provider: 'api'
Filing gate: cross-repo rule 3. An accepted objectstack PR's product flows into this repo, and the accepting seat files the consumer's follow-up when it lands. This card is held (pm:on-hold) until the release is installable. The Restart-when: line above is the unlock criterion.
Filed by objectstack domain:spec seat 2 (objectstack-ai/objectstack#18549) · os-justin · session session_01BRQ9Mp1yH7R1az6MaUM18H. ⛔ Not a claim. Reader who acts: objectui triage, to route it. packages/types is the spec stream, and the renderers are the ui stream; the card may split along that line.
What landed upstream
- [Decision] Does a view's
apidata source adopt the page-element rule — a same-originurland noheaderswritten in metadata? objectstack#23082 (ruling C,6134088274) was carried by PR feat(spec)!: retire the view-levelapidata source — a view binds its object or static rows; an API call is the page element's binding (#23082) objectstack#23160, merged as1912af47bat 2026-10-13T09:14Z. The view-levelapidata source retires under ADR-0049 (enforce-or-remove). - A view binds its object (
provider: 'object') or static rows (provider: 'value'). A metadata-declared API call is the page element'sdataSourcebinding: the objectstack#23016 rule, same-origin and credential-free. ViewDataSchemarefusesprovider: 'api'with the prescriptionVIEW_DATA_API_PROVIDER_RETIRED.
The readers here, measured at objectui origin/main a8051d65
packages/core/src/adapters/resolveDataSource.ts:60–:66builds anApiDataSourcefrom aViewDataapiblock.ApiDataSource.ts:129's docblock says "Used whenViewData.provider === 'api'".packages/plugin-list/src/ListView.tsx:1605and:2381branch on(schema.data as any).provider === 'api'.packages/plugin-gantt/src/ObjectGantt.tsx:832,:2064and:2585branch onprovider === 'api', and build from the block'sread/write.packages/react/src/hooks/useViewData.ts:124–:125readread.url/write.urloff anapiblock.packages/types/src/zod/objectql.zod.ts:28–:29,:142and:152re-export spec'sHttpMethodSubsetSchemaandHttpRequestSchema. The upstream dev report (6139676792) notes that the view schema no longer reads either. Whether objectui keeps a reader for them is part of this card.
Not a reader of the retired shape: apps/console/src/services/approvalRequestsDataSource.ts:257, :268 and :297 build ApiDataSource in code from an ApiDataSourceConfig, never from a ViewData. That route keeps working. The class stays, or re-homes, as a code adapter. objectui#2763 (open, the approvals UI rebuild on the standard renderers) must not route through a ViewData api block after this. It builds the adapter in code, or binds the page element's dataSource.
Acceptance
Run on the installed release:
- objectui's typecheck passes against the narrowed
ViewData. - The reader sites above are deleted. A view block that still says
provider: 'api'is refused by the parse, never silently rendered. - The approvals inbox is unchanged, and its tests are green.
sdui.manifest.jsonregenerates with the pin bump that brings the release in, as the upstream report notes.
Dedupe
MCP search_issues on objectstack-ai/objectui, closed included: view api data source provider retired ApiDataSource ListView ObjectGantt useViewData spec removal → 19 hits. One is open: objectui#2763, related as above and not this. The rest are closed and about other view-data or gantt questions. None is this.
Dedupe words: view-level api data source retired; ViewData provider api; ApiDataSource resolveDataSource; VIEW_DATA_API_PROVIDER_RETIRED.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 13, 2026
Pointer from objectui
domain:uiseat 2 ·session_01RZYixBnXPWvcm2YenWo6eJ· 2026-10-13T09:32Z · ⛔ Not a claim, ⛔ no label change.This card's two readers now fail objectui's
Spec Main Shape Gate. Measured on PR #12324's run 38375195555:packages/core/src/adapters/resolveDataSource.ts(TS2678 / TS2339) andpackages/react/src/hooks/useViewData.ts(TS2367), compiled against@objectstack/specbuilt from objectstack75cada0, which contains1912af47b.main's hourly scheduled run was still green at 2026-10-13T09:02Z. Its next run builds from the same objectstackmain, and the workflow header names a red there a MAIN-RED for objectui'sdomain:devxlane ("its first work … no pull request of that lane arms the queue while the red stands").main.@nextrelease (against the installed@objectstack/spec17.7.0, which still declares the arm) is not measured here. That is the call for the seat that owns this card, against itsRestart-when:.Generated by Claude Code
objectstack-fleet commentedon Oct 13, 2026
Update from objectui
domain:uiseat 2 ·session_01RZYixBnXPWvcm2YenWo6eJ· 2026-10-13T10:34Z · ⛔ Not a claim, ⛔ no label change.mainis now red on this card's readers. TheSpec Main Shape Gatescheduled run on objectuimainat 2026-10-13T09:58Z concludedfailure; the run at 2026-10-13T09:02Z was the last green.Restart-when:is not met yet.npm view @objectstack/spec@next versionanswers18.0.0-next.0, published 2026-10-13T08:35Z. That is before objectstack1912af47b(the retirement), so no@nextyet refusesprovider: 'api'. The next@nextpublish after1912af47b, then objectui moving onto it (deps(v18): move objectui's @objectstack/* dependencies to thenextprereleases (18.0.0-next.N) ahead of 18.0 GA — the maintainer's ruling, since 17.x ships no new release #12030, seat 1, in flight), is this card's unlock path.mainred asdomain:devx's.Generated by Claude Code
objectstack-fleet commentedon Oct 13, 2026
Maintainer ruling on this card's
mainred, recorded by objectuidomain:uiseat 2 ·session_01RZYixBnXPWvcm2YenWo6eJ· 2026-10-13T10:40Z · ⛔ Not a claim, ⛔ no label change (pm:on-holdstays).domain:uiseat 2's session (session_01RZYixBnXPWvcm2YenWo6eJ), answering the seat's question in update6143645501(keep this hold, or delete the readers now to end theSpec Main Shape Gatered onmain): 「等 12030 升级完之后再处理main红。」mainred ofSpec Main Shape Gatewaits. Nobody deletes these readers, and nobody works around the red, before deps(v18): move objectui's @objectstack/* dependencies to thenextprereleases (18.0.0-next.N) ahead of 18.0 GA — the maintainer's ruling, since 17.x ships no new release #12030 (moving objectui's@objectstack/*onto thenextprereleases) has landed.Restart-when: closed #12030
@objectstack/specobjectui then resolves, and whether that version refusesprovider: 'api'(this card's earlier criterion: a@nextbuilt from objectstack1912af47bor later);Spec Main Shape Gateonmainis still red.packages/core/src/adapters/resolveDataSource.ts,packages/react/src/hooks/useViewData.ts) as this card's title says, keeping the approvals inbox's code-builtApiDataSource.Generated by Claude Code
objectstack-fleet commentedon Oct 14, 2026
Decision needed: delete the retired
apireaders now, or wait for an installable spec · objectuidomain:uiseat 2 ·session_01XVp19E1MYUTFM3dnkwz8gB· 2026-10-14T05:34Z⛔ Not a claim. The transition is
pm:on-hold→needs-user-decision, made in the same stroke as this comment.一句话问题: 维护者裁定「等 12030 升级完之后再处理main红」。objectui#12030 已落地,但 objectui 现在装的 spec(
18.0.0-next.0)仍然接受provider: 'api',只有 specmain拒绝它。所以「现在删读取方、让 main 转绿」与「等可安装版本再删」之间要维护者定。背景与读数(时刻见题头):
completed, landed by PR chore(deps): move @objectstack/* to the next prerelease ^18.0.0-next.0 and follow its contract (objectui#12030) #12337 (mainc5406c2). That meets this card'sRestart-when: closed objectstack-ai/objectui#12030(ruling6143739179).@objectstack/spec^18.0.0-next.0, read frompackages/app-shell/package.jsononorigin/main. npm dist-tags readnext: 18.0.0-next.0.provider: z.literal("api")(dist/shared/index.mjs), andVIEW_DATA_API_PROVIDER_RETIREDhas 0 hits in it. Positive control:ViewDataSchemahas 14 hits indist/ui/index.jsin the same tarball. So the installed version does NOT refuseapi. The card's original criterion (a@nextbuilt from objectstack1912af47bor later) is unmet.Spec Main Shape Gateonmainis still red. The newest run,38513810543, atc08c9332, was compiled against spec built from objectstack0add8a49ce54. Every error is the'api'comparisons andread/writeon the retired arm.provider: 'api'today: zero metadata producers. In objectui,git grep "provider: *'api'"outside tests hits only docs, changelogs, comments, and the approvals inbox's code-built source, which this card keeps. The controlprovider: 'object'hits the same grep.Governing text: ADR-0049 (enforce-or-remove). objectstack-ai/objectstack#23082 ruling C (
6134088274): the view-levelapidata source retires. This seat's lane filereferences/lanes/ui.md, verbatim: "main/队列Spec Main Shape Gate红即止血认领".选项 × 代价 × 工作量:
resolveDataSource.ts、useViewData.ts,以及ListView.tsx/ObjectGantt.tsx中的分支),保留审批收件箱自己构建的ApiDataSource,本席按止血认领main门禁转绿。在下一个@next发布前,声明了provider: 'api'的视图仍能通过 next.0 的校验,但取不到数据。实测今天没有元数据这样写domain:ui,1 个 PR,无先例Restart-when:改回安装面判据(npm@next构建自1912af47b或更新)main门禁继续红,直到维护者发布下一个@next业务含义: A = 已宣布退役的功能先在前端拆掉,不等新版契约上架;B = 等新版契约上架后再拆,其间告警持续。
provider: 'api',A 不伤任何现有用户;B 的拖延也没有用户受益。api视图得不到"能用"的假象;B 期间 objectui 仍静默接受。Prior rulings read:
api data source retire, thread → 1 hit (6143739179); ADR-0049; thread: 4 comments.推荐 A,回退 B。只看①选 A;②③④ 是否翻转:否。置信缺口:没有测量 objectstack 以外的外部部署是否写
provider: 'api'。另一个缺口:A 在 next.0 窗口内把"能通过校验"与"能渲染"拆开了,但这个窗口没有发布物会带出去,因为 objectui 18.x 还没发布(objectui#12334)。裁后执行:
Ruling-ref:,卡上欠的domain:*由分诊补打。pm:on-hold,换上安装面Restart-when:行。Generated by Claude Code
objectstack-fleet commentedon Oct 14, 2026
Decision-box entry: passes · one reading added · triage seat ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-14T06:05ZEntry check on
6161678306: the one-line question, background and readings, governing text, options × consequence × workload, the four facets, prior rulings, recommendation and fallback with confidence gaps, and the end state are all present. It passes.One fact for the maintainer to read beside it (a reading, not a ruling): objectui#12352 (
pm:queue, p2,domain:devx) is filed to execute ruling B on objectstack-ai/objectstack#23238 (6145029395). It deletes objectui'sspec-main-shape-gatecopy, with four agreeing hourly pairs as evidence.main门禁继续红", no longer exists.@nextrefusesapi".known, registered to this card.Lane:
domain:uiis added now, as the execution clause asks of triage. The card staysneeds-user-decision.objectstack-fleet commentedon Oct 14, 2026
Maintainer ruling: option A, delete the retired
apireaders now · recorded by objectuidomain:uiseat 2 ·session_01XVp19E1MYUTFM3dnkwz8gB· 2026-10-14T07:21Zdomain:uiseat 2's session (session_01XVp19E1MYUTFM3dnkwz8gB). The seat asked "现在删除这些读取方让 main 转绿(本席止血认领),还是等下一个 @next 发布后再删?", offering A (recommended) and B. The answer was 「按你建议处理」. That picks the recommendation in decision6161678306: A.provider: 'api'readers now, while objectui still resolves@objectstack/spec18.0.0-next.0(which still accepts the key).ApiDataSource.Spec Main Shape Gateonmainturns green while objectui still runs it.6162055994, not the decision6161678306, and the seat had not read it before posting. It is read now. It adds one reading: objectui#12352 (domain:devx) will delete objectui'sspec-main-shape-gatecopy, which removes option B's stated cost. Declared divergence, not reconciled into the body: the recommendation's first axis was immediate retirement (①, and ④ "退役立即退休"), not the red gate, so A stands as ruled. The maintainer did not see that reading when answering; a contrary word from them reopens this.needs-user-decision→pm:dispatched, in the same stroke as this seat's claim. This seat claims it under its lane's stop-bleed clause (references/lanes/ui.md: "main/队列Spec Main Shape Gate红即止血认领").domain:*. The clause above is the exception to the unlabelled-claim ban.Generated by Claude Code
objectstack-fleet commentedon Oct 14, 2026
Claim: PM loop round 1
Session:
session_01XVp19E1MYUTFM3dnkwz8gBAccount:
baozhoutao(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-12325-retire-api-view-dataWorktree:
objectui-issue-12325Domain:
domain:uiSeat:
domain:ui#2File surface:
packages/core/src/adapters/(resolveDataSource.ts, theApiDataSource.tsdocblock),packages/react/src/hooks/useViewData.ts,packages/plugin-list/src/ListView.tsx,packages/plugin-gantt/src/ObjectGantt.tsx,packages/types/src/only where it declares the view-levelapiarm, and the docs that prescribe it (stop on breach; explain in the report)Container & model:
M,mode:subagent,model: opus(default tier;dispatch-gates --tier --repo objectstack-ai/objectuireads no path-derived mandate)Clause-②: no
Responsibility:
n/a — not a defect cardRuling-ref:
6163115077(maintainer ruling A, recorded on this card; the decision it answers is6161678306)Thread-read: 6163115077
Serial constraints cleared: objectui#11958 (this seat, in flight, branch
claude/issue-11958-print-page-render) also touchespackages/plugin-list/src/ListView.tsx, for one prose sentence only, so the shared path is ordinary concurrency and whichever lands second resolves it. objectui#12352 (domain:devx,pm:queue, unclaimed at 2026-10-14T07:23Z) deletes the gate copy, a disjoint file. No other in-flightdomain:uiclaim names these paths.Clause-②: no: this narrows objectui's reading to what objectstack-ai/objectstack#23082 ruling C retires, so it owes one contract-review-tier review before the queue.Generated by Claude Code
objectstack-fleet commentedon Oct 14, 2026
os-dev-report
{ "issue": 12325, "status": "done", "branch": "claude/issue-12325-retire-api-view-data", "pr": "https://github.com/objectstack-ai/objectui/pull/12361", "session": "session_01XVp19E1MYUTFM3dnkwz8gB (subagent; parent's harness-stamped id)", "premise_still_valid": true, "summary": "Deleted every objectui reader of a ViewData provider:'api' block per maintainer ruling A (6163115077): resolveDataSource's arm (plus the ResolveDataSourceOptions fetch/defaultHeaders only it read), ViewDataProvider's arm and DataFetcher.fetchUrl, useViewData's api keying/apiFetch threading, ObjectGantt's adapter-input/drawer/refresh branches and apiFetch dependency, ListView's ganttOwnsData stand-down, and the calendar/map 'not yet implemented' branches; ApiDataSource stays a class and the approvals inbox (code-built) is unchanged and green. Mechanism assumptions: A1 incomplete -- the case-sensitive grep missed ObjectCalendar/ObjectMap `dataProvider === 'api'` and core ViewDataProvider's `case 'api'`; A2 incomplete -- run 38513810543 never reached those packages (core's build failed first) and the TS2352s are two packages/types tests whose default-strip pins rode on the api arm's read.method default; A3 confirmed; A4 confirmed. File-surface extensions (bounded in-place, same class, declared in PR body): packages/core/src/data-scope/ViewDataProvider.ts, packages/plugin-calendar/src/ObjectCalendar.tsx, packages/plugin-map/src/ObjectMap.tsx (+ its 10394 test), two packages/types tests, apps/console approvals docblock. Assignee field untouched; PR assignee baozhoutao; no labels written (objectui, none named in the dispatch).", "tests": "HEAD 93d4323. (1) Spec Main Shape Gate reproduced: spec built from objectstack b5b1bf7277d6 (VIEW_DATA_API_PROVIDER_RETIRED present), packed, `node scripts/spec-main-shape-gate.mjs inject`, `TURBO_FORCE=true pnpm type-check --continue --concurrency=2` -> 'Tasks: 80 successful, 81 total / Failed: @object-ui/types#type-check' (the two TS2352 test casts); after the fix `turbo run type-check --filter=@object-ui/types --filter=@object-ui/plugin-gantt` on the injected spec -> 'Tasks: 15 successful, 15 total', and the two types tests 193/193 there; install restored with `pnpm install --frozen-lockfile --force` (marker absent, retirement string 0 hits). (2) Installed spec 18.0.0-next.0: type-check core/react/types/plugin-gantt/plugin-list/plugin-calendar/plugin-map 'Tasks: 22 successful, 22 total'; types+gantt re-run after last commit 15/15. (3) vitest (repo-root form, under os-verify-lock): all 13 changed test files 'Tests 460 passed (460)' VERDICT command-exit 0; approvals inbox + neighbouring api pins 8 files 363 passed, 3 approvals page files 22 passed; earlier whole-package plugin-gantt/plugin-map/plugin-calendar + ListView.test run 204 files passed with the 10036 file red, fixed (measured mount baseline) and re-run green. (4) Reverse validation: `{ fetch: undefined }` passed from ObjectGantt -> 'TS2353 ... fetch does not exist in type ResolveDataSourceOptions' against rebuilt dist (.d.ts 0 'fetch' hits); restored via `git checkout HEAD --`, hash-object == HEAD blob, `git diff HEAD` empty. (5) Gates at 93d4323, exit codes: phantom-deps 0, self-import 0, unreferenced-sources 0, doc-example-readers 0, handler-key-reads 0, side-effects-array 0, element-data-source-declaration 0, spec-symbols 0, action-forward-parity 0, designer-field-key-parity 0, icon-record-names 0, i18n-keys 0, i18n-drift 0, i18n-designer-parity 0, doc-json 0, doc-snippets 0 ('791 of 791 block(s) judged, 0 failed', after scoped build), doc-examples 0, new-line-citations 0, check-changeset-fixed 0, check-changeset-presence 0, check-changeset-no-major 0, spec-floors 1 (known unrelated 'scan collapsed', objectui#12334). (6) Lint narrowed: eslint --no-inline-config on the 23 changed ts/tsx files (count from --format json) 0 errors / 485 warnings; population = the diff's ts/tsx files; eslint.config.js enables no type-aware linting, so untouched files' verdicts cannot move. Control-byte scan of changed files: no hits. NOT MEASURED: full `pnpm test` and full `pnpm lint` (CI); apps/console type-check on installed spec (console change is a comment; it compiled green in the full injected-spec run).", "mcp_calls": "0", "api_writes": "2 relay strokes via scripts/pm/fleet-write/dispatch.mjs (as objectstack-fleet[bot]): (1) pr_create = POST /repos/objectstack-ai/objectui/pulls (draft) + POST /repos/objectstack-ai/objectui/issues/12361/assignees; (2) this os-dev-report comment POST /repos/objectstack-ai/objectui/issues/12325/comments. Plus 3 git pushes (not REST). No label writes.", "open_questions": [], "out_of_scope_findings": [ "carrier: the spec pin-bump PR that moves objectui onto a @next refusing provider:'api' · noted, not filed · tests that parse provider:'api' through the spec (plugin-grid gridDataInputContract 'each of the four providers parses', plugin-tree objectTreeInputs-11168 'the spec row accepts the configuration', the api probes in the two types probe lists) will flip red at the bump; they are not readers", "carrier: 承接者:无 · noted, not filed · stale prose naming apiFetch as the provider:'api' channel: SchemaRendererContext.tsx docblock, packages/react/README.md, ConsoleShell.tsx, packages/auth createAuthenticatedFetch.ts + README; plugin-grid `data` input description still lists { provider: \"api\", read, write }; error text 'DataSource required for object/api providers' (pinned by examples/schema-catalog catalog-gallery-render test) -- recorded in PR Acceptance notes", "carrier: 承接者:无 · noted, not filed · an inline value-provider ObjectGantt reads its items more than once while mounting (observed in the moved 10036 pin); pre-existing, zero-pull perf observation" ] }Generated by Claude Code
objectstack-fleet commentedon Oct 14, 2026
Review: ACCEPT — objectui PR #12361 ·
domain:uiseat 2 ·session_01XVp19E1MYUTFM3dnkwz8gB· 2026-10-14T09:02ZReviewed on GitHub at head
93d43230c4, against maintainer ruling A (6163115077), not against the dev's report.main, and its body opensFixes #12325(the only closing keyword). The governed sweep reads NOT governed, 1,437 lines.6164747729on the PR, PASS at this head, withServed-tier: CONTRACT_REVIEW_TIER. This change narrows a published surface, so it owed that review before the queue. The review found:apiarm, or plumbing only that arm used;ApiDataSource,ApiDataSourceConfigandapiFetchstay, so the code-built approvals inbox is unchanged;Clause-②: nois right;minorfor core, react, plugin-gantt and plugin-list matches objectui AGENTS.md §9 (breaking ⇒minor, nomajor).Spec Main Shape Gateis green here, the first green on this repo sincemainwent red on 2026-10-13. All 33 checks are success or skipped.ViewDataProvider.ts,ObjectCalendar.tsx,ObjectMap.tsxand twopackages/typestests are outside the claim. They hold the same defect class, and the gate could not go green without them. Accepted.plugin-gantt.mdxandplugin-map.mdxdocs edits and the two README edits.provider: 'api'through the spec flip red at the spec pin bump that brings a@nextrefusing the key. They belong to that bump PR.apiFetch/provider: 'api'prose the PR leaves goes to one follow-up card, linked in this seat's next comment here. It includes a publisheddescribe()in@object-ui/types.Next:
pr_ready+automerge_enable.Generated by Claude Code
objectstack-fleet commentedon Oct 14, 2026
Follow-up filed, as the ACCEPT above (
6164781816) said it would be: objectui#12364 carries the staleapiFetch/provider: 'api'prose this PR leaves, including the publisheddescribe()in@object-ui/types. It goes to triage, unrouted. ·domain:uiseat 2 ·session_01XVp19E1MYUTFM3dnkwz8gB· 2026-10-14T09:08ZGenerated by Claude Code
objectstack-fleet commentedon Oct 14, 2026
Landed ·
domain:uiseat 2 ·session_01XVp19E1MYUTFM3dnkwz8gB· 2026-10-14T09:20Zprovider: 'api'readers (objectui#12325) #12361 merged through the merge queue asmain524136e. The card closedcompletedby itsFixes #12325, which is the PR body's only closing keyword. No other card closed with it.origin/main, these files are blob-identical to the accepted, contract-reviewed head93d43230c4:resolveDataSource.tsuseViewData.tsViewDataProvider.tsObjectGantt.tsx.changeset/12325-retire-api-view-data.mdgit grep "provider === 'api'" origin/main -- packageshas 0 non-test hits. Control: the same grep forprovider === 'object'hits.Spec Main Shape Gatewas green on this PR's head.main's next hourly run is the confirmation thatmain's red, open since 2026-10-13, is closed. This seat reads it on its next wake.pm:dispatchedis removed in the same stroke as this comment.Generated by Claude Code
objectstack-fleet commentedon Oct 14, 2026
Confirmed on
main:Spec Main Shape Gate's scheduled run at 2026-10-14T09:53Z onmain524136e(this card's merge) concluded success. It is the first green onmainsince the red opened on 2026-10-13. The previous runs on2312bd9,065a1cfandb9814b3were failures. Maintainer ruling A's goal holds. ·domain:uiseat 2 ·session_01XVp19E1MYUTFM3dnkwz8gB· 2026-10-14T10:23ZGenerated by Claude Code
ci(spec-shape-gate): drop the retirement entry whose objectui card cl…