Skip to content

fix(plugin-list,app-shell,console): settle a declared deadline in the list view's projection and the approval snapshots (objectui#11815) - #12879

Merged
objectstack-fleet[bot] merged 4 commits into
mainfrom
claude/issue-11815-settled-remainder
Oct 17, 2026
Merged

objectstack-fleet[bot] merged 4 commits into
mainfrom
claude/issue-11815-settled-remainder

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Fixes #11815
Clause-②: no

The remainder of ruling D after #12874 (f34e877): the two hosts that PR measured and left outside its surface.

What changed

  • List view projection (packages/plugin-list/src/ListView.tsx): the $select harvest gains one loop right after addSpeculative(rowColorConfig?.field). For each shown column (after the FLS filter) whose object field declares dueLike: true with a settledWhen, it runs addSpeculative on every operand collectPredicateFieldRefs finds. That is the same declared-field and FLS gate every binding there uses. A list that hides the predicate's field now fetches it, so its done rows read as settled. An operand the viewer may not read is never requested, and that deadline stays unsettled (it fails toward overdue).
  • Approvals inbox (apps/console/.../ApprovalsInboxPage.tsx, RecordFieldFace): passes deadlineSettled = isDeadlineSettled(def, snapshot, { scope, fields }).
  • Decision panel (packages/app-shell/.../RecordSnapshotSummary.tsx, FieldFace): the same call.
  • Docs (content/docs/fields/date.mdx): the "show that field as a column" caveat now describes what the code does.

What each approval face holds as its snapshot

  • ApprovalsInboxPage: the request row's payload, the object both the summary rows and the lead amount draw their values from. fields is the indexed object metadata.
  • RecordSnapshotSummary: withoutDeniedFields(payload, perms, object), the FLS-redacted values the face draws. A status the reader may not read is absent, so that deadline stays unsettled.

The snapshot's date and status were frozen together, so judging the snapshot's own state is the consistent reading.

Live (showcase via e2e/live/ci/start-backend.sh, @objectstack/cli 18.0.0-next.2, zh-CN)

  • On the stock showcase, main already sends status: showcase_task's row-action predicates project status, priority and done through the existing predicate harvest. So the stock metadata cannot tell main from this branch.
  • In the scratch backend only, I added a list view with columns title and due date, and pointed due_date's settledWhen at record.progress == 100. The done rows carry progress 100, and nothing else projects progress.
main f34e877 this branch
$select id,title,due_date,status,priority,done id,title,due_date,status,priority,progress,done
App wireframes (done) 逾期 6 天, red 6天前, neutral
Audit current IA (done) 9月29日, red 9月29日, neutral

Approval faces live: not measured. No showcase approval process targets an object that declares a deadline, so the unit pins below cover them.

Screenshots (never-merged claude/issue-11815b-evidence)

Tests (at 6ae5c25)

  • ListView.deadlineSettledSelect-11815: status is in $select when the view shows the deadline but not status. Against a backend that honours $select, a done row reads neutral and an open row overdue. CONTROL: an undeclared date with a settledWhen pulls nothing in. CONTROL: an operand the viewer may not read is not requested.
  • RecordSnapshotSummary.test and ApprovalsInboxPage.deadlineSettled-11815: a snapshot whose settledWhen holds draws its past deadline neutral; one where it does not draws it overdue. CONTROL: an undeclared past date is never overdue.
  • Ablation: each new pin turned red once under its mutation and was restored with git diff HEAD empty.
  • Full runs: plugin-list 1518 passed; the approval-decision and ApprovalsInboxPage files 138 passed; scripts/__tests__/ 5620 passed, 2 skipped.
  • build and type-check pass for plugin-list, app-shell and console.
  • Lint adds no finding on the touched host files.
  • check:i18n-keys, check:i18n-drift, changeset presence, no-major and check:new-line-citations all exit 0.

Deviations

  • Changesets are patch: a fix with no exported type, prop or i18n key moving.
  • The live reading needed the scratch-fixture change described above. The repo is untouched by it.

Session: https://claude.ai/code/session_01DiTjG1AEXG49VTNoVQ5cpt


Generated by Claude Code

… list view's projection and the approval snapshots

ListView's $select harvest now asks for a shown declared deadline's
settledWhen operands through addSpeculative, so a list that hides the
predicate's field still judges its done rows as settled. The two approval
snapshot faces pass deadlineSettled, judged against the snapshot they draw.

Claude-Session: https://claude.ai/code/session_01DiTjG1AEXG49VTNoVQ5cpt
Co-authored-by: Claude <noreply@anthropic.com>
…ion and snapshot faces; docs and changesets

Claude-Session: https://claude.ai/code/session_01DiTjG1AEXG49VTNoVQ5cpt
Co-authored-by: Claude <noreply@anthropic.com>
… build accepts the pin

Claude-Session: https://claude.ai/code/session_01DiTjG1AEXG49VTNoVQ5cpt
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 76 chunks) 3140.6 KB 3744.1 KB
Main entry chunk (gzip) 80.2 KB 350 KB
Entry file index-r5jzDSuW.js —
Status PASS —

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.


📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 21.42KB 7.85KB
app-shell (runtime-config.js) 23.60KB 8.19KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.11KB 3.87KB
auth (ActiveOrganizationStorage.js) 27.95KB 10.04KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 45.59KB 12.03KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 20.67KB 6.12KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.72KB 2.24KB
auth (SocialSignInButtons.js) 9.74KB 3.94KB
auth (UserMenu.js) 3.39KB 1.21KB
auth (auth-gate-events.js) 1.62KB 0.83KB
auth (authStyles.js) 5.27KB 1.86KB
auth (createAuthClient.js) 42.84KB 11.66KB
auth (createAuthenticatedFetch.js) 8.54KB 3.46KB
auth (index.js) 3.63KB 1.64KB
auth (invitation-status.js) 1.22KB 0.70KB
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) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 27.26KB 8.03KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.28KB 2.60KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (commentAuthorship.js) 1.39KB 0.78KB
collaboration (index.js) 1.93KB 0.85KB
collaboration (useCollaborationTranslation.js) 6.50KB 2.52KB
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) 606.28KB 146.84KB
core (index.js) 10.18KB 4.04KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 248.83KB 69.44KB
fields (index.js) 291.19KB 74.38KB
i18n (LocalizationContext.js) 2.92KB 1.42KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 2.59KB 1.22KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.52KB 2.39KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 39.35KB 12.88KB
i18n (translateFn.js) 0.20KB 0.18KB
i18n (useDisplayLocale.js) 3.52KB 1.76KB
i18n (useObjectLabel.js) 36.87KB 9.88KB
i18n (useSafeTranslation.js) 7.14KB 2.92KB
layout (index.js) 41.33KB 11.96KB
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.75KB
mobile (index.js) 1.99KB 0.87KB
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) 6.62KB 2.45KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 5.52KB 2.10KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 15.35KB 5.51KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.82KB 2.38KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.33KB 3.07KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 16.04KB 3.92KB
plugin-calendar (index.js) 54.94KB 16.05KB
plugin-charts (index.js) 84.97KB 23.36KB
plugin-chatbot (index.js) 210.60KB 49.94KB
plugin-dashboard (index.js) 146.23KB 39.59KB
plugin-designer (index.js) 233.95KB 50.08KB
plugin-detail (index.js) 264.38KB 69.99KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 180.22KB 46.59KB
plugin-gantt (index.js) 178.36KB 45.08KB
plugin-grid (index.js) 272.78KB 75.66KB
plugin-kanban (index.js) 62.30KB 19.27KB
plugin-list (index.js) 139.20KB 35.82KB
plugin-map (index.js) 27.07KB 8.96KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 46.66KB 13.13KB
plugin-timeline (index.js) 39.21KB 11.85KB
plugin-tree (index.js) 15.27KB 5.40KB
plugin-view (index.js) 94.68KB 24.36KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 12.07KB 3.68KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 120.23KB 39.46KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.50KB 2.06KB
react (schema-input.js) 4.31KB 2.07KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.50KB 1.99KB
sdui-parser (codegen.js) 9.45KB 3.76KB
sdui-parser (dashboard-widget-options.js) 3.07KB 1.30KB
sdui-parser (index.js) 7.30KB 3.12KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 25.28KB 7.81KB
sdui-parser (provenance.js) 3.84KB 1.90KB
sdui-parser (types.js) 0.29KB 0.24KB
sdui-parser (validate.js) 23.87KB 7.83KB
types (ai.js) 4.39KB 2.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 4.12KB 1.61KB
types (authoring-nodes.js) 0.20KB 0.19KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (cloud.js) 0.20KB 0.18KB
types (complex.js) 4.44KB 2.07KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (dashboard-widget-layout.js) 2.06KB 0.96KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 1.13KB 0.65KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 5.78KB 2.70KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 5.00KB 2.39KB
types (navigation.js) 0.20KB 0.18KB
types (node-slots.js) 7.18KB 2.34KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 2.52KB 1.31KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-approval-decision.js) 0.20KB 0.20KB
types (record-components.js) 0.20KB 0.19KB
types (record-panels.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 (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 4.99KB 1.96KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 19.93KB 7.26KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.48KB 3.50KB
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

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 76 chunks) 3140.6 KB 3744.1 KB
Main entry chunk (gzip) 80.2 KB 350 KB
Entry file index-r5jzDSuW.js —
Status PASS —

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.


📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 21.42KB 7.85KB
app-shell (runtime-config.js) 23.60KB 8.19KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.11KB 3.87KB
auth (ActiveOrganizationStorage.js) 27.95KB 10.04KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 45.59KB 12.03KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 20.67KB 6.12KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.72KB 2.24KB
auth (SocialSignInButtons.js) 9.74KB 3.94KB
auth (UserMenu.js) 3.39KB 1.21KB
auth (auth-gate-events.js) 1.62KB 0.83KB
auth (authStyles.js) 5.27KB 1.86KB
auth (createAuthClient.js) 42.84KB 11.66KB
auth (createAuthenticatedFetch.js) 8.54KB 3.46KB
auth (index.js) 3.63KB 1.64KB
auth (invitation-status.js) 1.22KB 0.70KB
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) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 27.26KB 8.03KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.28KB 2.60KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (commentAuthorship.js) 1.39KB 0.78KB
collaboration (index.js) 1.93KB 0.85KB
collaboration (useCollaborationTranslation.js) 6.50KB 2.52KB
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) 606.28KB 146.84KB
core (index.js) 10.18KB 4.04KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 248.83KB 69.44KB
fields (index.js) 291.19KB 74.38KB
i18n (LocalizationContext.js) 2.92KB 1.42KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 2.59KB 1.22KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.52KB 2.39KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 39.35KB 12.88KB
i18n (translateFn.js) 0.20KB 0.18KB
i18n (useDisplayLocale.js) 3.52KB 1.76KB
i18n (useObjectLabel.js) 36.87KB 9.88KB
i18n (useSafeTranslation.js) 7.14KB 2.92KB
layout (index.js) 41.33KB 11.96KB
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.75KB
mobile (index.js) 1.99KB 0.87KB
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) 6.62KB 2.45KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 5.52KB 2.10KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 15.35KB 5.51KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.82KB 2.38KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.33KB 3.07KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 16.04KB 3.92KB
plugin-calendar (index.js) 54.94KB 16.05KB
plugin-charts (index.js) 84.97KB 23.36KB
plugin-chatbot (index.js) 210.60KB 49.94KB
plugin-dashboard (index.js) 146.23KB 39.59KB
plugin-designer (index.js) 233.95KB 50.08KB
plugin-detail (index.js) 264.38KB 69.99KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 180.22KB 46.59KB
plugin-gantt (index.js) 178.36KB 45.08KB
plugin-grid (index.js) 272.78KB 75.66KB
plugin-kanban (index.js) 62.30KB 19.27KB
plugin-list (index.js) 139.20KB 35.82KB
plugin-map (index.js) 27.07KB 8.96KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 46.66KB 13.13KB
plugin-timeline (index.js) 39.21KB 11.85KB
plugin-tree (index.js) 15.27KB 5.40KB
plugin-view (index.js) 94.68KB 24.36KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 12.07KB 3.68KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 120.23KB 39.46KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.50KB 2.06KB
react (schema-input.js) 4.31KB 2.07KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.50KB 1.99KB
sdui-parser (codegen.js) 9.45KB 3.76KB
sdui-parser (dashboard-widget-options.js) 3.07KB 1.30KB
sdui-parser (index.js) 7.30KB 3.12KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 25.28KB 7.81KB
sdui-parser (provenance.js) 3.84KB 1.90KB
sdui-parser (types.js) 0.29KB 0.24KB
sdui-parser (validate.js) 23.87KB 7.83KB
types (ai.js) 4.39KB 2.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 4.12KB 1.61KB
types (authoring-nodes.js) 0.20KB 0.19KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (cloud.js) 0.20KB 0.18KB
types (complex.js) 4.44KB 2.07KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (dashboard-widget-layout.js) 2.06KB 0.96KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 1.13KB 0.65KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 5.78KB 2.70KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 5.00KB 2.39KB
types (navigation.js) 0.20KB 0.18KB
types (node-slots.js) 7.18KB 2.34KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 2.52KB 1.31KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-approval-decision.js) 0.20KB 0.20KB
types (record-components.js) 0.20KB 0.19KB
types (record-panels.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 (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 4.99KB 1.96KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 19.93KB 7.26KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.48KB 3.50KB
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

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对 — ACCEPT · objectui#11815 (remainder) · head 78ade7d · 2026-10-17T11:35Z

Seat domain:ui#4, session session_01SJn1GEkrbbBQkhGC26wEDw. Checked against GitHub and the diff, not against the report (relayed on the card, 6233346343). The seat opened this PR from the dev's drafts (degraded channel). The body and the title are the dev's drafts verbatim.

Checklist

  • Form:

  • The rulings, as bound:

    • List view projection. ListView.tsx's $select harvest gains one loop right after addSpeculative(rowColorConfig?.field). It takes the shown columns after the FLS filter (cols) whose object field declares dueLike: true with a settledWhen, and passes each collectPredicateFieldRefs operand to addSpeculative. That is the same declared-field and FLS gate every binding there uses. A column the viewer cannot read is not drawn, so nothing judges it. An operand the viewer cannot read is never requested, and its deadline stays unsettled, failing toward overdue.
    • Approval faces. ApprovalsInboxPage RecordFieldFace and RecordSnapshotSummary FieldFace each pass deadlineSettled = isDeadlineSettled(def, snapshot, { scope: usePredicateScope(), fields }). The snapshot is the object each face already draws value from: the request's payload in the inbox, and the FLS-redacted shown in the decision panel. A status the reader may not read is absent there, so that deadline stays unsettled, the same direction as the list.
    • Docs. The date.mdx caveat now states what the code does. A list view, a grid and a related list fetch the predicate's field themselves. A field the viewer may not read is never fetched. An approval's summary judges against its snapshot.
    • Changesets: three patch entries (plugin-list, app-shell, console), user-facing prose. No exported type, prop or i18n key moves.
  • The change the seat sent back, now in: at 6ae5c25 the new const deadlineSettled line in RecordSnapshotSummary.tsx sat between eslint-disable-next-line react-hooks/static-components and return <Cell …>. CI's Lint on 6ae5c25 went red on it: packages/app-shell pnpm run lint exited 1. 78ade7d moves the line above the directive, as ApprovalsInboxPage.tsx already had it. The dev re-ran normal-mode lint: exit 0 in app-shell, console and plugin-list, with no rule added over f34e877 on the four touched sources. RecordSnapshotSummary.test.tsx passes 19 of 19. The report's earlier lint reading ran with --no-inline-config, which ignores directives on both sides; the dev's correction replaces it.

  • Live (showcase via e2e/live/ci/start-backend.sh, @objectstack/cli 18.0.0-next.2, zh-CN, light):

    • On the stock showcase, main and the branch cannot be told apart, because showcase_task's row-action predicates already project status.
    • In a scratch copy of the backend only, the dev added a list view with columns title and due date, and pointed due_date's settledWhen at record.progress == 100. Nothing else projects progress.
    main f34e877 this branch
    $select id,title,due_date,status,priority,done adds progress
    App wireframes (done) 逾期 6 天, red 6天前, neutral
    Audit current IA (done) 9月29日, red 9月29日, neutral

    Approval faces live: not measured, because no showcase approval process targets an object that declares a deadline. The unit pins cover them.

  • Screenshots, read by the seat (never-merged claude/issue-11815b-evidence at be335f3): rows 6 and 9 are red on main and neutral on the branch, and every other row is unchanged. Sent to the maintainer at 2026-10-17T11:35Z.

  • Tests:

    • ListView.deadlineSettledSelect-11815, 4 cases:
      • $select carries status when only the deadline is shown;
      • against a backend that honours $select, a done row reads neutral and an open row overdue;
      • CONTROL: an undeclared date with a settledWhen pulls nothing in;
      • CONTROL: an operand the viewer may not read is not requested.
    • RecordSnapshotSummary.test +2 and ApprovalsInboxPage.deadlineSettled-11815 3: a settled snapshot draws neutral, an open one overdue. CONTROL: an undeclared past date is never overdue.
    • Five ablations, each red and each restored.
    • Full runs:
      • plugin-list: 1518 passed;
      • the approval-decision and inbox files: 138 passed;
      • scripts/__tests__/: 5620 passed.
    • Builds, type-check for all three packages, the i18n checks, changeset presence and no-major, and check:new-line-citations all exit 0.
  • CI: running on 78ade7d. Landing waits for green.

Rulings

  1. Channel: A, as taken. The dispatch's degraded channel stands over os-dev.md's self-opened PR while the relay refuses this container (403). The seat opened the PR and relayed the report, and no write went through MCP.
  2. No showcase view for the live lane: A. The unit pins cover the mechanism. A showcase view built only to expose the gap would be objectstack metadata with no consumer, and the gap fails toward a visible false overdue, not a hidden one.
  3. The live recipe's scratch-fixture edit is accepted as evidence. It touched a scratch copy only, never a repository, and the report gives both readings: on the stock showcase, where main and the branch cannot be told apart, and on the edited copy, where the new loop is what differs.

Implemented-by: cloud session session_01DiTjG1AEXG49VTNoVQ5cpt, branch claude/issue-11815-settled-remainder


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Landing · head 78ade7d · 2026-10-17T11:44Z

  • Head since the ACCEPT: unchanged at 78ade7d. The ACCEPT (6233414486) was checked against this exact commit, so its rulings stand.
  • Checks on 78ade7d: 36 runs: 33 green, 3 expected skips, none red. Lint, which was red on 6ae5c25 for the misplaced directive, is green. So are Build & E2E, Repo Gates, all 16 test shards, Type Check, Bundle Analysis and Governed Surface Queue Guard. 6ae5c25's aggregate Test red came from its shards being cancelled by the 78ade7d push; no test ran red.
  • Merge state: clean against main 64acb7e. GitHub reports mergeable_state: clean, and git merge-tree agrees.
  • Commit messages: four commits (three changes and the lint fix) carry only the model-free trailer pair.
  • Action: mark the PR ready for review and enable auto-merge through the merge queue. Fixes #11815 closes the card on merge, together with PR fix(fields,core,grid,detail): overdue is declared-only, and a settled deadline paints nothing (objectui#11815) #12874.

Generated by Claude Code

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 17, 2026 11:45
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 17, 2026 11:45
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 17, 2026
Merged via the queue into main with commit bf376c5 Oct 17, 2026
37 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-11815-settled-remainder branch October 17, 2026 11:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

apps documentation Improvements or additions to documentation package: app-shell plugin tests

Projects

None yet

Development

Successfully merging this pull request may close these issues.

date cells: a due-like date on a completed record still renders red "Overdue Nd" (Done tasks flagged overdue)

2 participants