Skip to content

fix(fields,core,grid,detail): overdue is declared-only, and a settled deadline paints nothing (objectui#11815) - #12874

Merged
objectstack-fleet[bot] merged 8 commits into
mainfrom
claude/issue-11815-declared-overdue
Oct 17, 2026
Merged

objectstack-fleet[bot] merged 8 commits into
mainfrom
claude/issue-11815-declared-overdue

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Part of #11815 — two hosts outside the claimed file surface stay open, named under Deviations: ListView's own projection (ruling 6), and the approval snapshot faces.
Clause-②: yes

What changed

Ruling D (6054882132): overdue is declared-only.

  • The rule. A date / datetime reads overdue only when its field declares dueLike: true, and never while that field's settledWhen holds for the record. The field-name regex DUE_LIKE_FIELD_NAME retires (ADR-0049: nothing undeclared paints). An undeclared due_date in the past now reads as any past date does.
  • The prop. CellRendererProps.deadlineSettled?: boolean in @object-ui/fields. While it is true, DateCellRenderer and DateTimeCellRenderer paint no overdue wording and no text-red-600; the wording falls back to the neutral relative phrase. Absent or false changes nothing. Settled is never carried as dueLike: false.
  • The helper. isDeadlineSettled(field, row, { scope, fields }) in @object-ui/core (evaluator/deadlineSettled.ts), built on evalRowPredicate(settledWhen, row, { fallback: false, scope, fields }). It is false for a field without dueLike: true or without settledWhen, and false when the predicate fails to evaluate. Every host calls it; none has its own copy.
  • Hosts changed.
    • ObjectGrid: object columns, name columns and inline-row fields now forward dueLike and settledWhen; three of the four builders used to drop dueLike. Every cell and link cell on all four paths gets deadlineSettled for its row. The grid's own $select adds a shown deadline's settledWhen operands through the existing declared-field and FLS gates.
    • The record page: DetailSection's read-only cell, judged against data, and HeaderHighlight, judged against the staged record. fieldEnrichment forwards settledWhen beside dueLike and takes neither from the view entry.
    • RelatedList: each child row is judged on its own row, never the parent's. The row's dueLike is forwarded, and its projection asks for the predicate's operands.
    • Kanban card, gallery card (which now also forwards dueLike), compact list and tree: one call-site line each.
  • Hosts measured and left alone. ReportViewer and the dashboard's buildFieldMeta forward no dueLike, so they paint no overdue at all. RecordMetaFooter draws only user lookups. DetailView's summary chips do not reach the date cells.
  • The view-level key. DetailViewField.dueLike and its DetailViewFieldSchema row are retired, with no alias. Producer search for the authored view-level key found 0 in objectui (apps/, packages/, examples/, content/docs), 0 in hotcrm, and in objectstack examples/ only field-level declarations (app-showcase task, app-todo task, app-crm activity). Semver is minor on the precedent of f61dab1 (objectui#11070 round 4, DetailViewField.reference_to retired as a Minor Change in @object-ui/types 17.7.0).
  • Docs. content/docs/fields/date.mdx, datetime.mdx and api/schema-reference.md drop the name convention and the view-level key, and say how settledWhen reaches each view.

Inverted pins (each a CONTROL now)

  • DateCellRenderer.test.tsx — 'labels a past due_date as Overdue Nd' is now 'CONTROL — an undeclared past due_date reads neutral', plus a declared twin.
  • datetimeCell.dueLikeAffordance-8958.test.tsx — 'the field-name heuristic answers the same on both cells' is now 'CONTROL — with no key authored, a deadline-shaped name paints nothing on either cell'.
  • DetailSection.dueLikeReachesTheCell-9729.test.tsx — the view-entry key no longer reaches the cell; the object field's does.
  • mirror-only-published-keys-9729.test.ts — the key is absent from both published faces.
  • Re-declared, subject unchanged: date-locale-channel 'resolves through the translate fn' (zh, en) and dateCell.unparsableValue-8581 'POPULATED — a past due_date is still Overdue Nd' now declare dueLike: true.

Live, before and after

Setup: showcase at @objectstack/cli 18.0.0-next.2 through e2e/live/ci/start-backend.sh; task due_date declares dueLike: true and settledWhen: record.status == 'done'. A throwaway copy adds an undeclared renewal_on. zh-CN, light, today 2026-10-17.

Row main 473e5a0 this branch
Audit current IA (done, due 09-29) 9月29日 red 9月29日 neutral
App wireframes (done, due 10-11) 逾期 6 天 red 6天前 neutral
Design system (in review, due 10-13) 逾期 4 天 red 逾期 4 天 red
renewal_on 10-12 (undeclared, matches the old regex) 逾期 5 天 red 5天前 neutral

On the record page of the done task, the highlights strip reads 逾期 6 天 in red on main and 6天前 neutral on the branch.

Screenshots (evidence branch claude/issue-11815-evidence, not merged):

Test evidence (head c6a46ce)

  • Full suites of fields, core, types, plugin-grid, plugin-detail, plugin-kanban, plugin-list and plugin-tree: 1610 files and 25618 tests passed, exit 0.
  • build and type-check pass for all eight packages.
  • check:i18n-keys, check:i18n-drift, check:new-line-citations, changeset presence and no-major all exit 0.
  • Lint on the touched files adds nothing: 4 pre-existing errors on main and here, identical.
  • Each new pin was ablated once and turned red. The view-level key's TypeScript pin was reverse-checked: re-declaring the member gives TS2578 and TS2344.

Deviations

  • ListView (plugin-list/src/ListView.tsx, outside the claimed surface) builds the $select for console list views and has no arm for settledWhen operands. A list view that hides status leaves done rows overdue, as today. The fix is one addSpeculative loop; this needs the seat's call.
  • Approval snapshot faces (ApprovalsInboxPage RecordFieldFace, app-shell RecordSnapshotSummary FieldFace) draw a declared deadline beside the record snapshot with no deadlineSettled. The fix is one call-site line each; this needs the seat's call.
  • ReportViewer is in the claimed surface but unchanged: report columns carry no dueLike.

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


Generated by Claude Code

…ints nothing (objectui#11815)

- `@object-ui/core` gains `isDeadlineSettled(field, row, { scope, fields })`,
  built on `evalRowPredicate`: settled only when the field declares
  `dueLike: true` and a `settledWhen` that holds for the row; a faulting
  predicate is not settled.
- `CellRendererProps` gains the optional `deadlineSettled` prop. While it is
  true, the date and datetime cells paint no overdue wording and no red.
- The field-name regex behind `resolveDueLike` retires: only a declared
  `dueLike: true` makes a date a deadline. Pins that asserted the name guess
  are inverted to controls; two pins that used an undeclared `due_date` as a
  vehicle for the overdue wording now declare it.

Claude-Session: https://claude.ai/code/session_01LzSF1MK7r46WEAYG2ooGiq
Co-authored-by: Claude <noreply@anthropic.com>
The deadline is the object field's declaration (`DateFieldMetadata.dueLike`
and `settledWhen`, by reference to `@objectstack/spec`). `DetailViewField`
and `DetailViewFieldSchema` drop their `dueLike` member, with no alias; the
pins that asserted the key now assert its absence on both faces.

Claude-Session: https://claude.ai/code/session_01LzSF1MK7r46WEAYG2ooGiq
Co-authored-by: Claude <noreply@anthropic.com>
…ledWhen (objectui#11815)

`DetailSection`'s read-only cell, `HeaderHighlight` and `RelatedList` hand
each date cell `deadlineSettled` from `isDeadlineSettled`, judged against the
record (or, in a related list, each child row). Enrichment forwards the
field's `settledWhen` beside its `dueLike`, and never takes either from the
view entry. `RelatedList` asks for a drawn deadline's `settledWhen` operands
through its existing projection gates.

Claude-Session: https://claude.ai/code/session_01LzSF1MK7r46WEAYG2ooGiq
Co-authored-by: Claude <noreply@anthropic.com>
… row (objectui#11815)

The object-column, name-column and inline-row builders forward the field's
`dueLike` and `settledWhen` (only the object-field-list builder used to carry
the field whole), and every cell, links included, gets `deadlineSettled` from
`isDeadlineSettled` for its row. The grid's own projection asks for a shown
declared deadline's `settledWhen` operands through the existing gates.

Claude-Session: https://claude.ai/code/session_01LzSF1MK7r46WEAYG2ooGiq
Co-authored-by: Claude <noreply@anthropic.com>
…clared deadline (objectui#11815)

The kanban card, the gallery card, the compact list and the tree hand each
date cell `deadlineSettled` from `isDeadlineSettled` for the record they draw.
The gallery's field enrichment now carries the field's `dueLike`.

Claude-Session: https://claude.ai/code/session_01LzSF1MK7r46WEAYG2ooGiq
Co-authored-by: Claude <noreply@anthropic.com>
… (objectui#11815)

The date / datetime pages and the schema reference drop the retired field-name
convention and the authored view-level `dueLike`, and say how `settledWhen`
reaches each view. One changeset per released package touched.

Claude-Session: https://claude.ai/code/session_01LzSF1MK7r46WEAYG2ooGiq
Co-authored-by: Claude <noreply@anthropic.com>
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对 — ACCEPT · objectui#11815 · head c6a46ce · 2026-10-17T09:36Z

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

Checklist

  • Form:

    • Draft → main, assignee os-sales.
    • The first line is Part of #11815 with its reason, and the second is Clause-②: yes, as the claim declares (6231347884).
    • Seven commits, each carrying only the model-free trailer pair. One is a plain merge of origin/main, with no rebase and no force-push.
    • git merge-tree against current main is clean. 39 files, +1155 / −245, all inside the claim's surface. ReportViewer.tsx is unchanged, with the reason given. No PNG. Not a governed surface.
  • Ruling D, as bound:

    • resolveDueLike reads dueLike === true and nothing else. DUE_LIKE_FIELD_NAME and its name read are gone.
    • CellRendererProps.deadlineSettled?: boolean: while it is true both cells resolve as a non-deadline, with the neutral wording and no text-red-600. "Settled" is never written into the field as dueLike: false.
    • isDeadlineSettled(field, row, { scope, fields }) (core/src/evaluator/deadlineSettled.ts) is false without dueLike: true or settledWhen, and otherwise evalRowPredicate(…, { fallback: false }), so a failing predicate is not settled.
    • Every host calls that helper:
      • ObjectGrid forwards dueLike and settledWhen on all four column paths. Its $select adds a shown deadline's predicate operands through the existing declared-field and FLS gates.
      • DetailSection judges against data, and HeaderHighlight against the staged record.
      • RelatedList judges each child row on itself.
      • The kanban card, gallery card, compact list and tree each get one call-site line.
    • The view-level key retires. DetailViewField.dueLike and its zod row are removed after a producer search: 0 in objectui, 0 in hotcrm, and only field-level declarations in objectstack's examples. enrichDetailField takes neither key from the view entry.
  • Live (showcase at @objectstack/cli 18.0.0-next.2 through e2e/live/ci/start-backend.sh; task due_date declares dueLike + settledWhen: record.status == 'done'; zh-CN; 2026-10-17):

    row main 473e5a0 this branch
    Audit current IA (done) 9月29日, red 9月29日, neutral
    App wireframes (done) 逾期 6 天, red 6天前, neutral
    Design system (in review) 逾期 4 天, red 逾期 4 天, red (CONTROL)
    renewal_on (undeclared, matched the old regex) 逾期 5 天, red 5天前, neutral
  • Screenshots, read by the seat (zh-CN, light; never-merged claude/issue-11815-evidence at 2c26117, PNGs only):

    • the All Tasks grid, before and after, matching the table above row by row;
    • App wireframes' record page, whose highlights strip reads 截止日期 6天前, neutral, beside the 已完成 stage.

    Sent to the maintainer at 2026-10-17T09:36Z.

  • Tests:

  • Changesets: eight, one per released package, all minor; user-facing prose.

  • CI: running at this record. Landing waits for green and for the contract review below.

Rulings

  1. Q1, ListView's own projection: A, on this card after this PR lands. It is the same one-list edit the grid and RelatedList received here: an addSpeculative loop over a shown deadline's settledWhen operands, plus one pin. The gap fails toward a false overdue that an author cannot see. The seat re-claims the remainder on this card, a small follow-up in plugin-list/src/ListView.tsx. Docs that tell authors to show the predicate's field as a column are revisited in that follow-up.
  2. Q2, the approval snapshot faces: A, in the same follow-up. The face draws the snapshot's date, and the snapshot carries the status as submitted. Judging settledWhen against that same snapshot is the consistent reading, since the date and the status are frozen together. One call-site line each, in ApprovalsInboxPage's RecordFieldFace and RecordSnapshotSummary's FieldFace, with a pin.
  3. Q3, the dashboard and the report viewer: A, left alone. Neither forwards dueLike, so neither claims to honour it, and nothing measured pulls for overdue there.
  4. The recorded decisions are accepted:
    • the view-level key retires with no alias;
    • minor follows f61dab1 (objectui#11070's reference_to, a Minor Change in @object-ui/types 17.7.0), and the no-major gate would refuse a major anyway;
    • enrichment strips both keys from the view entry.
  5. The PM assumption correction is noted: DetailSection's read-only cell had no dependentValues, and the host now evaluates against data itself, as the reference note said.

Implemented-by: cloud session session_01LzSF1MK7r46WEAYG2ooGiq, branch claude/issue-11815-declared-overdue


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: TIER_DEFAULT
Head-sha: c6a46ceb2875bf09e2a83ea8f839c100eccba186
Local-runs: none

Face: the Clause-②: yes declaration of the claim 6231347884 on objectui#11815:

  • @object-ui/fields' published CellRendererProps gains a member;
  • @object-ui/core exports a helper;
  • @object-ui/types' DetailViewField loses dueLike;
  • an undeclared date stops reading overdue in every host.

The PR's file list carries no packages/spec/src/** path and no governed path.

Inputs read:

  • the card, the ruling 6054882132, the reference note 6229527325 and the claim;
  • the diff at the head above;
  • the eight changesets;
  • the PR body.

Nothing was built or run locally.

① Derived judgments

  • CellRendererProps.deadlineSettled?: boolean is one optional member. A host that does not pass it changes nothing about a declared deadline's rendering. No existing member changes shape.
  • isDeadlineSettled is one new export of @object-ui/core, built on the already-published evalRowPredicate with fallback: false. It reads the field's dueLike and settledWhen exactly as @objectstack/spec declares them (FieldSchema, by reference since objectui#12297), so the consumer follows the protocol rather than a local spelling.
  • DetailViewField.dueLike is removed from the interface and from DetailViewFieldSchema. A published optional member retires with no alias.
    • The spec's view schemas are strict, so no spec-validated app could author it.
    • The producer search found none.
    • A host that still passes it gets a type error, and on untyped data the key is now ignored (enrichment strips it).
    • This is the behaviour the ruling chose. The changeset states it.
  • The behavioural face: the field-name convention retires. An app that relied on due_date going red without a declaration loses the red, by ruling D (ADR-0049). The fields changeset says so and names the remedy (dueLike: true).
  • No i18n key, data-testid or component is added or removed.

② Semver level

Eight minor changesets, in pre mode on tag next:

  • @object-ui/fields, core and types;
  • the plugin-grid, plugin-detail, plugin-kanban, plugin-list and plugin-tree plugins.

Retiring an optional published member as minor follows the repo's own precedent: f61dab1, objectui#11070's DetailViewField.reference_to, shipped under Minor Changes in @object-ui/types 17.7.0. The no-major gate passes. Consistent.

③ Boundary flags

  • None that needs the maintainer's ruling. The convention's retirement and the view-level key's removal are ruling D's own words (6054882132).
  • To know: two hosts outside the claimed surface still render without deadlineSettled: ListView's projection and the approval snapshot faces. Both fail toward a false overdue, never toward a hidden one. The seat's ACCEPT rules both onto this card's follow-up.

Implemented-by: session_01LzSF1MK7r46WEAYG2ooGiq
Reviewed-by: session_01SJn1GEkrbbBQkhGC26wEDw

VERDICT: PASS


Generated by Claude Code

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 76 chunks) 3140.1 KB 3744.1 KB
Main entry chunk (gzip) 80.1 KB 350 KB
Entry file index-DovNh444.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.05KB 35.78KB
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

CI red · Test (shard 3/16) · head c6a46ce · 2026-10-17T09:46Z

  • Failing: scripts/__tests__/date-only-zone-pins-10183.test.ts, which runs packages/fields/src/__tests__/dateCell.overdueZone-10183.test.tsx in forked children under non-UTC zones. Two cases fail, both "yesterday's deadline stays red": { text: 'Yesterday', red: false } where red: true was expected. The aggregate Test gate is red because of this shard alone.
  • Cause: this PR. That pin renders an undeclared due_date field and relied on the retired name guess. Its suites run only inside the forked driver (describe.runIf(DRIVEN)), so the package-level full suite skipped them. Its subject is the zone-correct day of the overdue colour (objectui#10183), not the name convention.
  • Fix in progress: the dev session re-declares the field dueLike: true with the subject unchanged, as it did for two other pins in this PR. It also sweeps for other driven-only pins with the same dependency, reproduces the red, and runs scripts/__tests__/ in full. Landing waits for green.

Generated by Claude Code

…ctui#11815)

`dateCell.overdueZone-10183` runs only in forked children under non-UTC zones
(`date-only-zone-pins-10183` drives it), and it relied on the retired
field-name guess to make `due_date` a deadline. Its subject is the zone-correct
day of the overdue colour, so the field now declares `dueLike: true`.

Claude-Session: https://claude.ai/code/session_01LzSF1MK7r46WEAYG2ooGiq
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.3 KB 3744.1 KB
Main entry chunk (gzip) 80.1 KB 350 KB
Entry file index-O-CheTOA.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.05KB 35.78KB
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

Landing · head cf8beb1 · 2026-10-17T10:13Z

  • Head since the ACCEPT: c6a46ce → cf8beb1. One commit from the CI-red round (6232451477): dateCell.overdueZone-10183.test.tsx declares dueLike: true on its field, with the subject unchanged (the zone-correct day of the overdue colour). The product code is the same as at the ACCEPT (6232369404) and the contract review (6232373249), so their rulings stand.
  • Checks on cf8beb1: 36 runs, 33 green and 3 expected skips, none red. That includes Test (shard 3/16), the shard that was red, the aggregate Test gate, all 16 test shards, Repo Gates, Build & E2E, Type Check, Lint, Changeset Bump Policy (eight minors) and Bundle Analysis.
  • Merge state: clean against main bb6c38c.
  • Commit messages: eight commits carry only the model-free trailer pair. One is a plain merge of origin/main.
  • Action: mark it ready for review and enable auto-merge through the merge queue. The body reads Part of #11815, so the card stays open. After the merge this seat re-claims the remainder on the card (ACCEPT rulings 1–2: ListView's $select arm, and the two approval snapshot faces).

Generated by Claude Code

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 17, 2026 10:14
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 17, 2026 10:14
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 17, 2026
Merged via the queue into main with commit f34e877 Oct 17, 2026
37 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-11815-declared-overdue branch October 17, 2026 10:27
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.

2 participants