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 Oct 26, 2026. It is now read-only.
Repository navigation
This repository was archived by the owner on Oct 26, 2026. It is now read-only.
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
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.
A view binds its object (provider: 'object') or static rows (provider: 'value'). A metadata-declared API call is the page element's dataSource binding: the objectstack#23016 rule, same-origin and credential-free.
ViewDataSchema refuses provider: 'api' with the prescription VIEW_DATA_API_PROVIDER_RETIRED.
The readers here, measured at objectui origin/maina8051d65
packages/core/src/adapters/resolveDataSource.ts:60–:66 builds an ApiDataSource from a ViewDataapi block. ApiDataSource.ts:129's docblock says "Used when ViewData.provider === 'api'".
packages/plugin-list/src/ListView.tsx:1605 and :2381 branch on (schema.data as any).provider === 'api'.
packages/plugin-gantt/src/ObjectGantt.tsx:832, :2064 and :2585 branch on provider === 'api', and build from the block's read / write.
packages/react/src/hooks/useViewData.ts:124–:125 read read.url / write.url off an api block.
packages/types/src/zod/objectql.zod.ts:28–:29, :142 and :152 re-export spec's HttpMethodSubsetSchema and HttpRequestSchema. 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 ViewDataapi 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.json regenerates 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.
Pointer from objectui domain:ui seat 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) and packages/react/src/hooks/useViewData.ts (TS2367), compiled against @objectstack/spec built from objectstack 75cada0, which contains 1912af47b.
On PRs the gate is advisory, so PRs still land, each with one comment naming this card.
main's hourly scheduled run was still green at 2026-10-13T09:02Z. Its next run builds from the same objectstack main, and the workflow header names a red there a MAIN-RED for objectui's domain:devx lane ("its first work … no pull request of that lane arms the queue while the red stands").
So while this card is on hold, that gate stays red on main.
Whether the readers can be deleted before the @next release (against the installed @objectstack/spec 17.7.0, which still declares the arm) is not measured here. That is the call for the seat that owns this card, against its Restart-when:.
Update from objectui domain:ui seat 2 · session_01RZYixBnXPWvcm2YenWo6eJ · 2026-10-13T10:34Z · ⛔ Not a claim, ⛔ no label change.
main is now red on this card's readers. The Spec Main Shape Gate scheduled run on objectui main at 2026-10-13T09:58Z concluded failure; the run at 2026-10-13T09:02Z was the last green.
Maintainer ruling on this card's main red, recorded by objectui domain:ui seat 2 · session_01RZYixBnXPWvcm2YenWo6eJ · 2026-10-13T10:40Z · ⛔ Not a claim, ⛔ no label change (pm:on-hold stays).
Whose word, verbatim, where: the maintainer, in domain:ui seat 2's session (session_01RZYixBnXPWvcm2YenWo6eJ), answering the seat's question in update 6143645501 (keep this hold, or delete the readers now to end the Spec Main Shape Gate red on main): 「等 12030 升级完之后再处理main红。」
When it fires, the claimant re-checks, with readings, before any code:
which @objectstack/spec objectui then resolves, and whether that version refuses provider: 'api' (this card's earlier criterion: a @next built from objectstack 1912af47b or later);
whether Spec Main Shape Gate on main is still red.
Then it deletes the two readers (packages/core/src/adapters/resolveDataSource.ts, packages/react/src/hooks/useViewData.ts) as this card's title says, keeping the approvals inbox's code-built ApiDataSource.
Decision needed: delete the retired api readers now, or wait for an installable spec · objectui domain:ui seat 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',只有 spec main 拒绝它。所以「现在删读取方、让 main 转绿」与「等可安装版本再删」之间要维护者定。
objectui resolves @objectstack/spec^18.0.0-next.0, read from packages/app-shell/package.json on origin/main. npm dist-tags read next: 18.0.0-next.0.
That tarball still declares provider: z.literal("api") (dist/shared/index.mjs), and VIEW_DATA_API_PROVIDER_RETIRED has 0 hits in it. Positive control: ViewDataSchema has 14 hits in dist/ui/index.js in the same tarball. So the installed version does NOT refuse api. The card's original criterion (a @next built from objectstack 1912af47b or later) is unmet.
Spec Main Shape Gate on main is still red. The newest run, 38513810543, at c08c9332, was compiled against spec built from objectstack 0add8a49ce54. Every error is the 'api' comparisons and read / write on the retired arm.
Who writes 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 control provider: 'object' hits the same grep.
Governing text: ADR-0049 (enforce-or-remove). objectstack-ai/objectstack#23082 ruling C (6134088274): the view-level api data source retires. This seat's lane file references/lanes/ui.md, verbatim: "main/队列 Spec Main Shape Gate 红即止血认领".
Entry 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's spec-main-shape-gate copy, with four agreeing hourly pairs as evidence.
Once it lands, option B's stated cost, "main 门禁继续红", no longer exists.
The choice between A and B then rests only on "delete the retired readers now" versus "after an installable @next refuses api".
The objectstack gate the release reads already marks this retirement known, registered to this card.
Lane:domain:ui is added now, as the execution clause asks of triage. The card stays needs-user-decision.
Maintainer ruling: option A, delete the retired api readers now · recorded by objectui domain:ui seat 2 · session_01XVp19E1MYUTFM3dnkwz8gB · 2026-10-14T07:21Z
Whose word, verbatim, where: the maintainer, in domain:ui seat 2's session (session_01XVp19E1MYUTFM3dnkwz8gB). The seat asked "现在删除这些读取方让 main 转绿(本席止血认领),还是等下一个 @next 发布后再删?", offering A (recommended) and B. The answer was 「按你建议处理」. That picks the recommendation in decision 6161678306: A.
What it decides:
Delete the view-level provider: 'api' readers now, while objectui still resolves @objectstack/spec18.0.0-next.0 (which still accepts the key).
Keep the approvals inbox's code-built ApiDataSource.
The goal is that the retired readers are gone, so Spec Main Shape Gate on main turns green while objectui still runs it.
Freshness gate (corrected in place; the first wording was false): at recording time the card's newest comment was triage's entry check 6162055994, not the decision 6161678306, and the seat had not read it before posting. It is read now. It adds one reading: objectui#12352 (domain:devx) will delete objectui's spec-main-shape-gate copy, 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.
Transition: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 红即止血认领").
Triage owes this card's domain:*. The clause above is the exception to the unlabelled-claim ban.
Claim: PM loop round 1
Session: session_01XVp19E1MYUTFM3dnkwz8gB
Account: baozhoutao (the seat's linked user as GET /user answers it; the card's assignee)
Branch: claude/issue-12325-retire-api-view-data
Worktree: objectui-issue-12325
Domain: domain:ui
Seat: domain:ui#2
File surface: packages/core/src/adapters/ (resolveDataSource.ts, the ApiDataSource.ts docblock), 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-level api arm, 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/objectui reads no path-derived mandate)
Clause-②: no
Responsibility: n/a — not a defect card
Ruling-ref: 6163115077 (maintainer ruling A, recorded on this card; the decision it answers is 6161678306)
Thread-read: 6163115077
Serial constraints cleared: objectui#11958 (this seat, in flight, branch claude/issue-11958-print-page-render) also touches packages/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-flight domain:ui claim 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.
{
"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"
]
}
Reviewed on GitHub at head 93d43230c4, against maintainer ruling A (6163115077), not against the dev's report.
Shape: the PR is a draft against main, and its body opens Fixes #12325 (the only closing keyword). The governed sweep reads NOT governed, 1,437 lines.
Contract review of record:6164747729 on the PR, PASS at this head, with Served-tier: CONTRACT_REVIEW_TIER. This change narrows a published surface, so it owed that review before the queue. The review found:
every deletion is a reader of the retired view-level api arm, or plumbing only that arm used;
ApiDataSource, ApiDataSourceConfig and apiFetch stay, so the code-built approvals inbox is unchanged;
Clause-②: no is right;
minor for core, react, plugin-gantt and plugin-list matches objectui AGENTS.md §9 (breaking ⇒ minor, no major).
The ruling's goal is met on this head.Spec Main Shape Gate is green here, the first green on this repo since main went red on 2026-10-13. All 33 checks are success or skipped.
File surface:ViewDataProvider.ts, ObjectCalendar.tsx, ObjectMap.tsx and two packages/types tests are outside the claim. They hold the same defect class, and the gate could not go green without them. Accepted.
Prose checked sentence by sentence: each changeset bullet matches the diff. So do the plugin-gantt.mdx and plugin-map.mdx docs edits and the two README edits.
Carried:
The tests that parse provider: 'api' through the spec flip red at the spec pin bump that brings a @next refusing the key. They belong to that bump PR.
The stale apiFetch / provider: 'api' prose the PR leaves goes to one follow-up card, linked in this seat's next comment here. It includes a published describe() in @object-ui/types.
Follow-up filed, as the ACCEPT above (6164781816) said it would be: objectui#12364 carries the stale apiFetch / provider: 'api' prose this PR leaves, including the published describe() in @object-ui/types. It goes to triage, unrouted. · domain:ui seat 2 · session_01XVp19E1MYUTFM3dnkwz8gB · 2026-10-14T09:08Z
Verified by content: on origin/main, these files are blob-identical to the accepted, contract-reviewed head 93d43230c4:
resolveDataSource.ts
useViewData.ts
ViewDataProvider.ts
ObjectGantt.tsx
.changeset/12325-retire-api-view-data.md
No reader left:git grep "provider === 'api'" origin/main -- packages has 0 non-test hits. Control: the same grep for provider === 'object' hits.
The ruling's goal:Spec Main Shape Gate was green on this PR's head. main's next hourly run is the confirmation that main's red, open since 2026-10-13, is closed. This seat reads it on its next wake.
Label:pm:dispatched is removed in the same stroke as this comment.
Confirmed on main:Spec Main Shape Gate's scheduled run at 2026-10-14T09:53Z on main524136e (this card's merge) concluded success. It is the first green on main since the red opened on 2026-10-13. The previous runs on 2312bd9, 065a1cf and b9814b3 were failures. Maintainer ruling A's goal holds. · domain:ui seat 2 · session_01XVp19E1MYUTFM3dnkwz8gB · 2026-10-14T10:23Z
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…
fix: retire the view-level `provider: 'api'` readers (objectui#12325) (…