Skip to content

fix(dashboard): date 型 globalFilter 的预设名默认值应提升为区间 (objectstack#4475) - #3150

Merged
os-zhuang merged 2 commits into
mainfrom
claude/v17-verification-defects-gnf9e6-analytics
Aug 1, 2026
Merged

fix(dashboard): date 型 globalFilter 的预设名默认值应提升为区间 (objectstack#4475)#3150
os-zhuang merged 2 commits into
mainfrom
claude/v17-verification-defects-gnf9e6-analytics

Conversation

@os-zhuang

@os-zhuang os-zhuang commented Aug 1, 2026

Copy link
Copy Markdown
Contributor

修复 objectstack#4475 —— Setup → 系统概览(System Overview)每块 KPI 都读 0。

配套的 framework 侧 PR:objectstack-ai/objectstack#4494(修 #4467 / #4437,同名分支)。framework 侧无需为本缺陷改动任何代码,理由见下。


现象

Setup → 系统概览,周期选择器显示 全部时间 / All time,而每块 KPI 都是 0:

tile 显示 实际
用户总数 0 4
活跃会话 0 16
登录事件 0 非 0

所有请求都是 200 OK,widget 正常渲染,UI 里没有任何失败信号——0 读起来像"还没有数据",而不是像错误。这是最难被发现的那一类。

根因:一处缺失的归一化,同时造成两个症状

issue 原文推测是 dataset 路径把 all-time 区间降级成了等值比较。实测证明不是:dataset 路径拿到真正的区间时 lowering 完全正确,它收到的本来就是一个标量。我用 curl 把 Console 实际发出的请求复现了出来(issue 里没能从 curl 复现,关键是 dataset 要内联传、selection.measures 必须非空):

POST /api/v1/analytics/dataset/query
{"dataset":{...,"object":"sys_user","measures":[{"name":"user_count","aggregate":"count"}]},
 "selection":{"measures":["user_count"],"runtimeFilter":{"created_at":"last_7_days"}}}

→ {"rows":[{"user_count":0}],
   "sql":"SELECT COUNT(*) AS \"user_count\" FROM \"sys_user\" WHERE created_at = $1"}

与 issue 里贴的 SQL 一字不差。 而同一条路径拿到区间时:

runtimeFilter:{"created_at":{"$gte":"{7_days_ago}","$lte":"{today}"}}
→ "… WHERE (created_at >= $1 AND created_at < $2)"   rows: [{"user_count":4}]
无 filter → rows: [{"user_count":4}]      /data/sys_user → total 4

真正的问题在 Console:一个裸的预设名字符串被当成比较值发了出去。

链路:

  1. framework 的 system_overview.dashboard.ts 声明
    globalFilters: [{ field:'created_at', type:'date', defaultValue:'last_7_days' }]
    这是合规写法——GlobalFilterSchema.defaultValuez.union([string, number, boolean]),根本不允许对象形式,所以裸预设名是作者唯一能写的拼法。
  2. resolveDashboardFilterDefs内置 dateRange 声明会把预设名提升成 { preset }
    (defaultValue: preset && preset !== 'custom' ? { preset } : undefined),
    globalFilters 分支原样透传 f.defaultValue。这个不对称就是本缺陷。
  3. 于是 buildFilterConditiontypeof v === 'object' 为 false,落到
    "A bare string date means equality on that day" 那一支,原样返回字符串 →
    WHERE created_at = 'last_7_days' → 恒 0。
  4. 同一个缺失也解释了为什么选择器显示"全部时间":DateRangeFilter
    selectValue = value?.preset ?? (value?.from || value?.to ? CUSTOM : ALL),
    裸字符串上这三个属性全是 undefined,于是落到 ALL 哨兵显示"全部时间",
    而底下发出去的却是那个字符串。

"显示全部时间"和"KPI 全为 0"不是两件事,是同一个根因的两个症状。 这也是为什么 UI 看起来像"刻意没有过滤、只是恰好没数据"。

改动

normalizeDateDefaultglobalFilters 分支补上与内置 dateRange 同一套归一化:typedate/dateRange、且 defaultValue 是本模块确实认识的预设名时,提升为 { preset }

这不是"在消费端加 ?? 兜底"(AGENTS.md Prime Directive #12):它是同一个归一化函数对兄弟声明补齐同一个转换,而且 spec 只允许标量,producer 侧根本没有别的写法可改。framework 的 dashboard metadata 不应该动——它是合规的,改它只会把缺陷藏起来。

保守边界:真正的 ISO 日期字符串仍然表示"当天等值"(既有的文档化行为),数字、布尔、以及不认识的字符串原样保留

验证

真实 dev server(framework worktree,pnpm dev -- --fresh -p 38101),对比修复前后 Console 发出的两种 runtimeFilter:

--- Users ---      truth (/data) = 4
  BEFORE (裸字符串)   [{'user_count': 0}] | … WHERE created_at = $1
  AFTER  (提升后)     [{'user_count': 4}] | … WHERE (created_at >= $1 AND created_at < $2)
--- Sessions ---   truth (/data) = 3
  BEFORE             [{'session_count': 0}] | … WHERE created_at = $1
  AFTER              [{'session_count': 3}] | … WHERE (created_at >= $1 AND created_at < $2)

(该环境 session 实际为 3 条,非 issue 里的 16;要点是 0 → 与 /data 一致的真值。)

回归测试

  • packages/core/src/utils/__tests__/dashboard-filters.test.ts 新增 4 例:预设名提升为 {preset}、提升后产出区间而非等值(并断言 widget-scoped 的 runtimeFilter 形状)、真正的 ISO 日期仍为等值、非 date 型 filter 不受影响。
  • 新增 packages/plugin-dashboard/src/__tests__/DashboardFilterBar.dateDefault.test.tsx:直接用 System Overview 的声明原文断言控件显示"Last 7 days"而非"All time";并保留"值确实为空时仍显示 All time"。
闸门 结果
pnpm --filter @object-ui/core test 17 files / 124 passed
pnpm --filter @object-ui/plugin-dashboard test 17 files / 124 passed
pnpm type-check 运行中,结果将在下方评论补充

残留问题(已单独立项:#3151)

date 型 filter 拿到一个既不是已知预设、也不是合法 ISO 日期的字符串时,仍会静默降级成一个永不命中的等值比较,继续产生"看着健康的 0"。预设名这一类由本 PR 覆盖,拼错的自定义值不会。按 Prime Directive #10 单独记录在 #3151(未认领),不在本 PR 扩大范围。

Fixes objectstack-ai/objectstack#4475

…objectstack#4475)

Setup → System Overview rendered EVERY KPI tile as 0 while its period
selector read "All time" — 200 OK on every request, no error anywhere in
the UI, and zeros that read as "nothing has happened yet" rather than as a
failure.

Both symptoms are one missing normalization. `resolveDashboardFilterDefs`
lifts the built-in `dateRange` declaration's preset NAME to `{ preset }`,
but passed a `globalFilters` entry's `defaultValue` through raw — and
`GlobalFilterSchema.defaultValue` is `string | number | boolean`, so a bare
preset name is the only spelling an author can write. System Overview
declares `{ field: 'created_at', type: 'date', defaultValue: 'last_7_days' }`
and nothing ever mapped it:

  - `buildFilterCondition` fell through to its "a bare string date means
    equality on that day" branch, so the widget sent
    `runtimeFilter: { created_at: 'last_7_days' }` and the backend compiled
    `SELECT COUNT(*) AS "user_count" FROM "sys_user" WHERE created_at = $1`
    — verified against a live server, byte-for-byte the SQL in the issue.
    Actual `sys_user` count is 4; the equality matches no row.
  - `DateRangeFilter` derives its selected item from `value.preset` /
    `.from` / `.to`, all undefined on a bare string, so the control fell
    through to its ALL sentinel and displayed "All time" — which is why the
    tiles looked deliberately unfiltered instead of broken.

`normalizeDateDefault` now applies the same lift the sibling `dateRange`
declaration already gets, for `date`/`dateRange` filters whose default names
a preset this module actually knows. A genuine ISO date string still means
equality on that day (the documented behaviour), and numbers, booleans and
unrecognised strings are left exactly as declared.

The backend needs no change: given a real range the dataset path already
lowers it correctly (`WHERE (created_at >= $1 AND created_at < $2)` → 4).
The framework's dashboard metadata needs none either — it is spec-compliant
as written, and editing it would only hide the defect.

Fixes objectstack-ai/objectstack#4475

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017gEHJN2NFpS9VMeURvakgD
@vercel

vercel Bot commented Aug 1, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectui Ignored Ignored Aug 1, 2026 12:11pm

Request Review

…jectstack#4475)

`@object-ui/core` owns the changed source (`dashboard-filters.ts`); the
plugin-dashboard side of the change is test-only, so it takes no bump.

Levelled `minor` rather than `patch` because the change is visible in
rendered dashboards rather than internal: any dashboard declaring a
date-typed globalFilters default now emits a different query shape, its
numbers change from 0 to real values, and its filter control's displayed
label changes with them.

Refs objectstack-ai/objectstack#4475

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017gEHJN2NFpS9VMeURvakgD
@github-actions

github-actions Bot commented Aug 1, 2026

Copy link
Copy Markdown
Contributor

❌ Console Performance Budget

Metric Value Budget
Main entry (gzip) ** KB** KB
Entry file ``
Status FAIL

📦 Bundle Size Report

Package Size Gzipped
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 1.17KB 0.53KB
auth (AuthProvider.js) 22.10KB 4.37KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.12KB 3.41KB
auth (LoginForm.js) 17.86KB 5.29KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.43KB 2.09KB
auth (SocialSignInButtons.js) 9.60KB 3.89KB
auth (UserMenu.js) 3.40KB 1.22KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 35.76KB 9.11KB
auth (createAuthenticatedFetch.js) 4.37KB 1.69KB
auth (index.js) 2.35KB 1.07KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 4.91KB 0.87KB
auth (useIsWorkspaceAdmin.js) 1.61KB 0.85KB
collaboration (CommentThread.js) 18.38KB 4.49KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 3.65KB 1.42KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.25KB 0.53KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 475.95KB 104.41KB
core (index.js) 2.25KB 0.80KB
create-plugin (index.js) 9.28KB 2.98KB
data-objectstack (index.js) 136.20KB 34.74KB
fields (index.js) 223.45KB 54.66KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (currency.js) 1.22KB 0.64KB
i18n (i18n.js) 4.32KB 1.77KB
i18n (index.js) 2.46KB 0.96KB
i18n (pickLocalized.js) 1.70KB 0.83KB
i18n (provider.js) 5.37KB 1.72KB
i18n (useObjectLabel.js) 26.14KB 6.07KB
i18n (useSafeTranslation.js) 3.26KB 1.44KB
layout (index.js) 38.44KB 10.66KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.74KB
mobile (index.js) 1.50KB 0.62KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 2.53KB 0.85KB
mobile (useResponsive.js) 0.71KB 0.42KB
mobile (useResponsiveConfig.js) 1.36KB 0.63KB
mobile (useSpecGesture.js) 4.05KB 1.53KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 8.75KB 3.06KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 3.67KB 1.12KB
permissions (evaluator.js) 4.41KB 1.44KB
permissions (index.js) 0.91KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.52KB
permissions (usePermissions.js) 1.55KB 0.71KB
plugin-ai (index.js) 15.71KB 3.79KB
plugin-charts (index.js) 60.52KB 17.11KB
plugin-chatbot (index.js) 180.09KB 42.72KB
plugin-dashboard (index.js) 111.59KB 28.74KB
plugin-detail (index.js) 222.45KB 54.50KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 111.38KB 26.93KB
plugin-grid (index.js) 184.69KB 48.91KB
plugin-list (index.js) 104.82KB 25.30KB
plugin-map (index.js) 16.80KB 5.24KB
plugin-markdown (index.js) 13.65KB 4.67KB
plugin-timeline (index.js) 25.75KB 7.32KB
plugin-tree (index.js) 8.34KB 2.82KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.71KB 3.53KB
providers (index.js) 0.44KB 0.22KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.67KB 2.37KB
react (LazyPluginLoader.js) 3.77KB 1.33KB
react (SchemaRenderer.js) 19.28KB 6.38KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 1.02KB 0.55KB
sdui-parser (codegen.js) 4.09KB 1.74KB
sdui-parser (index.js) 4.47KB 2.03KB
sdui-parser (parse.js) 10.04KB 2.82KB
sdui-parser (types.js) 0.29KB 0.24KB
sdui-parser (validate.js) 4.69KB 1.48KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 0.99KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 0.20KB 0.18KB
types (crud.js) 0.20KB 0.18KB
types (data-display.js) 0.20KB 0.18KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.87KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-retry.js) 4.32KB 2.02KB
types (index.js) 2.46KB 1.21KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 0.20KB 0.18KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (spec-report.js) 5.05KB 1.93KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 0.20KB 0.18KB
types (ui-action.js) 3.40KB 1.71KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

@github-actions

github-actions Bot commented Aug 1, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Main entry (gzip) 28.1 KB 350 KB
Entry file index-BRKCVm_4.js
Status PASS

📦 Bundle Size Report

Package Size Gzipped
app-shell (index.js) 8.45KB 3.08KB
app-shell (runtime-config.js) 7.42KB 2.32KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 7.57KB 2.97KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 1.17KB 0.53KB
auth (AuthProvider.js) 22.10KB 4.37KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.12KB 3.41KB
auth (LoginForm.js) 17.86KB 5.29KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.43KB 2.09KB
auth (SocialSignInButtons.js) 9.60KB 3.89KB
auth (UserMenu.js) 3.40KB 1.22KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 35.76KB 9.11KB
auth (createAuthenticatedFetch.js) 4.37KB 1.69KB
auth (index.js) 2.35KB 1.07KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 4.91KB 0.87KB
auth (useIsWorkspaceAdmin.js) 1.61KB 0.85KB
collaboration (CommentThread.js) 18.38KB 4.49KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 3.65KB 1.42KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.25KB 0.53KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 475.95KB 104.41KB
core (index.js) 2.25KB 0.80KB
create-plugin (index.js) 9.28KB 2.98KB
data-objectstack (index.js) 136.20KB 34.74KB
fields (index.js) 223.45KB 54.66KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (currency.js) 1.22KB 0.64KB
i18n (i18n.js) 4.32KB 1.77KB
i18n (index.js) 2.46KB 0.96KB
i18n (pickLocalized.js) 1.70KB 0.83KB
i18n (provider.js) 5.37KB 1.72KB
i18n (useObjectLabel.js) 26.14KB 6.07KB
i18n (useSafeTranslation.js) 3.26KB 1.44KB
layout (index.js) 38.44KB 10.66KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.74KB
mobile (index.js) 1.50KB 0.62KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 2.53KB 0.85KB
mobile (useResponsive.js) 0.71KB 0.42KB
mobile (useResponsiveConfig.js) 1.36KB 0.63KB
mobile (useSpecGesture.js) 4.05KB 1.53KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 8.75KB 3.06KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 3.67KB 1.12KB
permissions (evaluator.js) 4.41KB 1.44KB
permissions (index.js) 0.91KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.52KB
permissions (usePermissions.js) 1.55KB 0.71KB
plugin-ai (index.js) 15.71KB 3.79KB
plugin-calendar (index.js) 44.90KB 12.35KB
plugin-charts (index.js) 60.52KB 17.11KB
plugin-chatbot (index.js) 180.09KB 42.72KB
plugin-dashboard (index.js) 111.59KB 28.74KB
plugin-designer (index.js) 210.51KB 42.50KB
plugin-detail (index.js) 222.45KB 54.50KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 111.38KB 26.93KB
plugin-gantt (index.js) 162.26KB 39.53KB
plugin-grid (index.js) 184.69KB 48.91KB
plugin-kanban (index.js) 47.82KB 13.18KB
plugin-list (index.js) 104.82KB 25.30KB
plugin-map (index.js) 16.80KB 5.24KB
plugin-markdown (index.js) 13.65KB 4.67KB
plugin-report (index.js) 40.32KB 10.53KB
plugin-timeline (index.js) 25.75KB 7.32KB
plugin-tree (index.js) 8.34KB 2.82KB
plugin-view (index.js) 83.54KB 20.39KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.71KB 3.53KB
providers (index.js) 0.44KB 0.22KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.67KB 2.37KB
react (LazyPluginLoader.js) 3.77KB 1.33KB
react (SchemaRenderer.js) 19.28KB 6.38KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 1.02KB 0.55KB
sdui-parser (codegen.js) 4.09KB 1.74KB
sdui-parser (index.js) 4.47KB 2.03KB
sdui-parser (parse.js) 10.04KB 2.82KB
sdui-parser (types.js) 0.29KB 0.24KB
sdui-parser (validate.js) 4.69KB 1.48KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 0.99KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 0.20KB 0.18KB
types (crud.js) 0.20KB 0.18KB
types (data-display.js) 0.20KB 0.18KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.87KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-retry.js) 4.32KB 2.02KB
types (index.js) 2.46KB 1.21KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 0.20KB 0.18KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (spec-report.js) 5.05KB 1.93KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 0.20KB 0.18KB
types (ui-action.js) 3.40KB 1.71KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

Copy link
Copy Markdown
Contributor Author

闸门全部完成 ✅

正文里"pnpm type-check 运行中"那一行现在有结论了,补齐如下。

CI(head 9d03426)

检查 结论
Type Check ✅ success
Test (shard 1/4 · 2/4 · 3/4 · 4/4) ✅ 全部 success
Lint ✅ success
Build & E2E ✅ success
Bundle Analysis ✅ success
Changeset Fixed Group Check ✅ success
Dev-server fixture build ✅ success
Build Docs ✅ success
Test (coverage) / dependabot skipped

没有失败项,也没有需要归因到 main 既有失败的项。

本地闸门

结果
pnpm --filter @object-ui/core test 17 files / 124 passed
pnpm --filter @object-ui/plugin-dashboard test 17 files / 124 passed
pnpm type-check 0 个 error TS;CI 上同名 job 独立跑通

(顺带一提:本仓库的脚本名是 type-check,不是 framework 那边的 typecheck。)

关于 changeset

按门禁要求补了 .changeset/dashboard-date-filter-preset-default.md:

"@object-ui/core": minor

只有 @object-ui/core 参与版本:改动的源文件 dashboard-filters.ts 属于它;plugin-dashboard 那边只新增了测试文件,不需要 bump。

minor 而非 patch 的理由(changeset 正文里有完整论述):这个改动是在渲染出来的 dashboard 上可见的,不是内部细节——任何声明了 date 型 globalFilters 默认值的 dashboard,发出的查询形状变了、数字从 0 变成真值、筛选控件显示的文案也跟着变。任何断言了原先那个条件的东西都会看到它移动。

残留问题

已按 Prime Directive #10 单独立项到 #3151(未认领),正文的"残留问题"小节已更新为该编号。


Generated by Claude Code

@os-zhuang
os-zhuang marked this pull request as ready for review August 1, 2026 12:32
@os-zhuang
os-zhuang merged commit b414983 into main Aug 1, 2026
16 checks passed
@os-zhuang
os-zhuang deleted the claude/v17-verification-defects-gnf9e6-analytics branch August 1, 2026 12:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Setup System Overview: every KPI tile reads 0 — the dataset path lowers an all-time range to WHERE created_at = $1

2 participants