Skip to content

docs(plugin-map): correct the marker-title fallback the README documents - #6564

Merged
os-support-ai merged 2 commits into
mainfrom
claude/issue-6530-plugin-map-readme-marker-title
Aug 26, 2026
Merged

docs(plugin-map): correct the marker-title fallback the README documents#6564
os-support-ai merged 2 commits into
mainfrom
claude/issue-6530-plugin-map-readme-marker-title

Conversation

@claude

@claudeclaudeBot commented Aug 26, 2026

Copy link
Copy Markdown
Contributor

Fixes#6530

What was wrong

packages/plugin-map/README.md:95 described the map block's titleField as:

Field shown as the marker title. Omitted, markers are titled Marker.

That described the pre-objectui#5953 read site, which bound the marker title to a field
name directly. objectui#5953 moved the marker title onto @object-ui/core's
getRecordDisplayName, and 'Marker' is now passed only as that resolver's fallback
option — a position reached only by a record carrying no id at all
(ObjectMap.tsx:769-772). So "omitted ⇒ Marker" was true in one narrow corner and false
in the common case, and an author reading the row would either under-specify titleField
for a reason that stopped being true, or over-specify it to dodge a Marker that would
never have appeared.

What the row says now

The row names the precedence an omitted titleField defers to: the declared nameField,
its deprecated displayNameField alias, the legacy titleFormat template, a type-aware
pick from the object's fields, then name-ish keys read straight off the record — with
Record #<id> as the floor and Marker reached only by an id-less record.

Two things the prose does deliberately

It does not describe an object-level objectDef.titleField rung. The resolver
consults one today as step 0's second ?? leg, but #6531 / PR #6560 removes it — the
spec's object schema is a strictObject that rejects the key with unrecognized_keys.
I read that PR's diff rather than trusting the summary: it changes step 0 only, and
every other rung survives byte-for-byte. What survives is options.titleField, which is
exactly what mapConfig.titleField becomes at ObjectMap's call site, so "a declared
titleField wins" holds both before and after #6560 lands and this row does not go stale
when it does.

It names the record-key probe (the resolver's step 4b) as its own rung. This is the
one place my reading of the source disagreed with the dispatch summary, which listed the
ladder as nameFielddisplayNameFieldtitleFormat → type-aware derivation →
Record #<id> and omitted 4b. For this component 4b is not a footnote — it is often the
only live rung. ObjectMap fetches an object schema only when !hasInlineData && dataSource (ObjectMap.tsx:729), and both staticData and an inline data array
normalize to provider: 'value' (ObjectMap.tsx:125-158), so for inline data no object
definition ever reaches the resolver and steps 1–4 are all no-ops. ObjectMap also does
not pass deriveFromRecordKeys: false, so the probe is on. ObjectMap.markerTitle.test.tsx
pins exactly this case ("inline value data with no object definition: the record-key
probe resolves it"), and ObjectMap.tsx's own comment above the call site names it too.
Omitting it would have shipped a second summary-shaped inaccuracy into the row I was
sent to correct.

A second row, fixed in place

Two lines below the table, the field-name defaults paragraph listed what an unconfigured
map falls back to as latitude / longitude / location / name / description.
name is stale there for the same reason and by the same commit: objectui#5953
removed the title default when it moved the marker title onto getRecordDisplayName.
getMapConfig's default branch (ObjectMap.tsx:402-415) returns the three coordinate
keys and descriptionField only, under a comment that says so outright — "Deliberately
NO titleField (objectui#5953) … getRecordDisplayName resolves it from the object
definition, and it does so better than any literal here could". The paragraph now lists
the four defaults that exist and says where an unconfigured marker's title comes from.

Fixed in place rather than filed: same defect class as the card, mechanically pinned by
the source comment above, same file already in this PR's face, and no new verification
surface. The rest of that sentence — map: { titleField: 'name' } naming no coordinate
field and rendering an empty map — was checked and is accurate, so it is untouched.

Scope

packages/plugin-map/README.md (two rows, both falsified by objectui#5953) plus the
changeset. ObjectMap.tsx is evidence,
not a target — the code is correct. content/docs/plugins/plugin-map.mdx:125 was verified
accurate and left alone. packages/core/src/utils/record-title.ts belongs to #6531 and was
read only.

Verification

Gate union re-run on the final commit 062dd7935:

GateVerdict line
check:control-bytes✅ check-control-bytes: OK (scanned 5421 tracked text file(s); skipped 85 binary).
check-changeset-presence✅ No source of a released package changed in this range, so no changeset is owed.
check-changeset-no-major✅ No changeset declares a major bump.
check:doc-fences✅ check:doc-fences — every TypeScript block in 223 document(s) is fenced ts/tsx/typescript…
check-doc-linksLinks are valid across 17 scan roots.

check:readme-exports is NOT MEASURED, not green and not red. It exits 1 in a fresh
worktree with 378 of its 380 findings reading type entry ./dist/index.d.ts is not on disk -- run pnpm build first, spanning every package (app-shell, auth, …) — a prerequisite
refusal, not a verdict. It also provably cannot see this diff: the gate judges import
bindings inside README code fences, line 95 is not inside a fence, and the diff adds zero
import lines. The only plugin-map entry in its output is the pre-existing fence at
README.md:160. CI builds first and runs it for real.

No test run is claimed: this changes prose only, compiles nothing, and the behaviour was
already pinned by ObjectMap.markerTitle.test.tsx, which I read but did not modify.


Generated by Claude Code

The `map` block table described `titleField` as "Omitted, markers are titled
`Marker`." That described the pre-objectui#5953 read site, which bound the marker
title to a field name directly. objectui#5953 moved the marker title onto
`@object-ui/core`'s `getRecordDisplayName`, where `'Marker'` is passed only as
the resolver's `fallback` option — a position reached only by a record carrying
no id at all. A record with an id and no resolvable name reads `Record #<id>`.
The row now names the precedence an omitted `titleField` defers to: the declared
`nameField`, its deprecated `displayNameField` alias, the legacy `titleFormat`
template, a type-aware pick from the object's fields, then name-ish keys read
straight off the record, with `Record #<id>` as the floor.
The row deliberately does not describe an object-level `objectDef.titleField`
rung, which objectui#6531 removes from the resolver; the surviving
`options.titleField` leg is what `map.titleField` becomes at the call site.
It does name the record-key probe, which is the only rung that can title a
marker when `staticData` or an inline `data` array means no object definition
ever reaches the resolver.
Prose only; no behaviour changes.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011SfZeFWrhGLHmfq61xbz4q
@github-actionsgithub-actionsBot added documentation Improvements or additions to documentation plugin labels Aug 26, 2026
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Eager closure (gzip, 52 chunks)3235.1 KB3266.6 KB
Main entry chunk (gzip)157.0 KB350 KB
Entry fileindex-MKuU-pha.js
StatusPASS

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

PackageSizeGzipped
app-shell (consoleActionDispatch.js)0.20KB0.19KB
app-shell (index.js)11.71KB4.46KB
app-shell (runtime-config.js)18.10KB6.51KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)10.06KB3.86KB
auth (ActiveOrganizationStorage.js)25.05KB9.16KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)2.07KB1.00KB
auth (AuthProvider.js)40.18KB10.59KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.15KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.65KB2.22KB
auth (SocialSignInButtons.js)9.61KB3.89KB
auth (UserMenu.js)3.41KB1.23KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)40.21KB10.80KB
auth (createAuthenticatedFetch.js)8.46KB3.43KB
auth (index.js)3.19KB1.44KB
auth (invitation-status.js)1.22KB0.70KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)5.30KB1.02KB
auth (useWorkspaceAdminStatus.js)5.13KB2.35KB
collaboration (CommentThread.js)26.08KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.68KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)506.01KB114.64KB
core (index.js)5.30KB2.13KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)173.10KB47.96KB
fields (index.js)238.89KB60.02KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (fallbackInterpolation.js)6.25KB2.77KB
i18n (i18n.js)4.28KB1.75KB
i18n (index.js)3.44KB1.39KB
i18n (pickLocalized.js)7.62KB3.26KB
i18n (provider.js)26.89KB9.04KB
i18n (useDisplayLocale.js)2.85KB1.45KB
i18n (useObjectLabel.js)33.40KB8.71KB
i18n (useSafeTranslation.js)5.60KB2.33KB
layout (index.js)38.95KB10.97KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.75KB
mobile (index.js)1.55KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.72KB0.42KB
mobile (useResponsiveConfig.js)1.37KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)9.53KB3.38KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)4.64KB1.50KB
permissions (evaluator.js)5.12KB1.74KB
permissions (index.js)0.93KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.53KB
permissions (usePermissions.js)1.93KB0.88KB
plugin-ai (index.js)15.75KB3.80KB
plugin-calendar (index.js)46.91KB12.92KB
plugin-charts (index.js)64.66KB18.32KB
plugin-chatbot (index.js)188.60KB44.82KB
plugin-dashboard (index.js)133.48KB34.49KB
plugin-designer (index.js)212.80KB43.15KB
plugin-detail (index.js)245.29KB62.39KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)131.78KB32.19KB
plugin-gantt (index.js)165.16KB40.33KB
plugin-grid (index.js)201.66KB54.58KB
plugin-kanban (index.js)53.16KB14.65KB
plugin-list (index.js)112.74KB27.50KB
plugin-map (index.js)20.09KB6.62KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)43.51KB11.94KB
plugin-timeline (index.js)26.72KB7.71KB
plugin-tree (index.js)9.26KB3.13KB
plugin-view (index.js)84.85KB20.79KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.66KB3.50KB
providers (index.js)0.45KB0.23KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.62KB2.34KB
react (LazyPluginLoader.js)4.47KB1.63KB
react (SchemaRenderer.js)63.21KB21.05KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)2.44KB1.21KB
react (schema-input.js)2.32KB1.24KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)5.41KB2.34KB
sdui-parser (dashboard-widget-options.js)3.08KB1.30KB
sdui-parser (index.js)4.93KB2.24KB
sdui-parser (input-type.js)2.84KB1.40KB
sdui-parser (parse.js)12.13KB3.65KB
sdui-parser (provenance.js)3.66KB1.82KB
sdui-parser (types.js)0.28KB0.23KB
sdui-parser (validate.js)7.54KB2.63KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)2.74KB1.41KB
types (crud.js)0.20KB0.18KB
types (dashboard-filter-alias.js)6.23KB2.74KB
types (data-display.js)3.75KB1.85KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.85KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-inflight.js)8.87KB3.73KB
types (http-retry.js)4.32KB2.02KB
types (icon-key-migration.js)4.26KB1.63KB
types (index.js)4.72KB2.24KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (spec-ui-namespace.js)0.20KB0.19KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)6.28KB2.87KB
types (ui-action.js)3.40KB1.71KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

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

Two lines below the `titleField` row corrected in the previous commit, the
field-name defaults paragraph listed what an unconfigured map falls back to as
`latitude` / `longitude` / `location` / `name` / `description`.
objectui#5953 removed the title default in the same change that moved the marker
title onto `getRecordDisplayName`. `getMapConfig`'s default branch returns the
three coordinate keys and `descriptionField` only, under a comment that states
the reason outright: "Deliberately NO `titleField` (objectui#5953)" — the
coordinate keys are guesses the component must make, a marker title is not.
The paragraph now lists the four defaults that exist and says where an
unconfigured marker's title comes from instead. The rest of the sentence is
untouched and still accurate.
Prose only; no behaviour changes.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011SfZeFWrhGLHmfq61xbz4q
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Eager closure (gzip, 52 chunks)3235.1 KB3266.6 KB
Main entry chunk (gzip)157.0 KB350 KB
Entry fileindex-MKuU-pha.js
StatusPASS

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

PackageSizeGzipped
app-shell (consoleActionDispatch.js)0.20KB0.19KB
app-shell (index.js)11.71KB4.46KB
app-shell (runtime-config.js)18.10KB6.51KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)10.06KB3.86KB
auth (ActiveOrganizationStorage.js)25.05KB9.16KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)2.07KB1.00KB
auth (AuthProvider.js)40.18KB10.59KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.15KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.65KB2.22KB
auth (SocialSignInButtons.js)9.61KB3.89KB
auth (UserMenu.js)3.41KB1.23KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)40.21KB10.80KB
auth (createAuthenticatedFetch.js)8.46KB3.43KB
auth (index.js)3.19KB1.44KB
auth (invitation-status.js)1.22KB0.70KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)5.30KB1.02KB
auth (useWorkspaceAdminStatus.js)5.13KB2.35KB
collaboration (CommentThread.js)26.08KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.68KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)506.01KB114.64KB
core (index.js)5.30KB2.13KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)173.10KB47.96KB
fields (index.js)238.89KB60.02KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (fallbackInterpolation.js)6.25KB2.77KB
i18n (i18n.js)4.28KB1.75KB
i18n (index.js)3.44KB1.39KB
i18n (pickLocalized.js)7.62KB3.26KB
i18n (provider.js)26.89KB9.04KB
i18n (useDisplayLocale.js)2.85KB1.45KB
i18n (useObjectLabel.js)33.40KB8.71KB
i18n (useSafeTranslation.js)5.60KB2.33KB
layout (index.js)38.95KB10.97KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.75KB
mobile (index.js)1.55KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.72KB0.42KB
mobile (useResponsiveConfig.js)1.37KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)9.53KB3.38KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)4.64KB1.50KB
permissions (evaluator.js)5.12KB1.74KB
permissions (index.js)0.93KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.53KB
permissions (usePermissions.js)1.93KB0.88KB
plugin-ai (index.js)15.75KB3.80KB
plugin-calendar (index.js)46.91KB12.92KB
plugin-charts (index.js)64.66KB18.32KB
plugin-chatbot (index.js)188.60KB44.82KB
plugin-dashboard (index.js)133.48KB34.49KB
plugin-designer (index.js)212.80KB43.15KB
plugin-detail (index.js)245.29KB62.39KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)131.78KB32.19KB
plugin-gantt (index.js)165.16KB40.33KB
plugin-grid (index.js)201.66KB54.58KB
plugin-kanban (index.js)53.16KB14.65KB
plugin-list (index.js)112.74KB27.50KB
plugin-map (index.js)20.09KB6.62KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)43.51KB11.94KB
plugin-timeline (index.js)26.72KB7.71KB
plugin-tree (index.js)9.26KB3.13KB
plugin-view (index.js)84.85KB20.79KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.66KB3.50KB
providers (index.js)0.45KB0.23KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.62KB2.34KB
react (LazyPluginLoader.js)4.47KB1.63KB
react (SchemaRenderer.js)63.21KB21.05KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)2.44KB1.21KB
react (schema-input.js)2.32KB1.24KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)5.41KB2.34KB
sdui-parser (dashboard-widget-options.js)3.08KB1.30KB
sdui-parser (index.js)4.93KB2.24KB
sdui-parser (input-type.js)2.84KB1.40KB
sdui-parser (parse.js)12.13KB3.65KB
sdui-parser (provenance.js)3.66KB1.82KB
sdui-parser (types.js)0.28KB0.23KB
sdui-parser (validate.js)7.54KB2.63KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)2.74KB1.41KB
types (crud.js)0.20KB0.18KB
types (dashboard-filter-alias.js)6.23KB2.74KB
types (data-display.js)3.75KB1.85KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.85KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-inflight.js)8.87KB3.73KB
types (http-retry.js)4.32KB2.02KB
types (icon-key-migration.js)4.26KB1.63KB
types (index.js)4.72KB2.24KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (spec-ui-namespace.js)0.20KB0.19KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)6.28KB2.87KB
types (ui-action.js)3.40KB1.71KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

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

@os-support-aiClaude

Copy link
Copy Markdown
Collaborator

ACCEPT — PM review of #6530, done from both trees.

You corrected my dispatch order, and you were right

My order laid out the ladder as nameFielddisplayNameFieldtitleFormat → type-aware derivation → the Record #<id> floor. It omitted step 4b, the name-ish record-key probe. Verified at record-title.ts:418, which documents itself as "the safety net for when the object schema (with its field types) wasn't available to deriveTitleField", with opt-out via deriveFromRecordKeys: false.

And your point about why that omission mattered here specifically is the part that makes this a real correction rather than a nit. Confirmed both halves:

  • ObjectMap.tsx:729if (!hasInlineData && dataSource) { fetchObjectSchema(); }, so an object schema is fetched only when there is no inline data;
  • staticData is the schema's declared door for inline rows, so for inline data no objectDef reaches the resolver at all and steps 1–4 are dead;
  • ObjectMap never passes deriveFromRecordKeys: false, and ObjectMap.markerTitle.test.tsx pins exactly that case.

So for plugin-map the rung I left out is frequently the only live one. Shipping my ladder verbatim would have put a second summary-shaped inaccuracy into the very row I sent you to correct — which is precisely the defect class this card exists to fix. That is the sixth time today a dev on this lane has overturned something in one of my orders, and it is the most on-point of them.

⭐ Equally right: you read PR #6560's diff rather than my summary of it, and confirmed independently that only step 0's second ?? leg moves and every other rung is byte-identical. The prose is therefore true both before and after that PR lands, and names no objectDef.titleField rung. Reading the diff rather than trusting a PM's account of a diff is the correct instinct.

The second row

The bounded in-place fix is justified — same defect class, same file, same gate family, mechanically pinned. Verified: ObjectMap.tsx:406 carries "Deliberately NO titleField (objectui#5953). The coordinate keys above …", so the defaults paragraph listing name among them was false in the same way and for the same reason. Fixing it in the same pass is correct; leaving it would have meant a third card on one README.

⚠️ Worth noting how I nearly mis-verified this: my first search for Deliberately NO titleField returned zero, because the source wraps the identifier in backticks and I had searched your un-backticked paraphrase. A literal-string zero against a paraphrase is not a zero — my ninth false zero this session, all mine, all the same shape.

The prose

It stands alone and it earns its length: it names the full precedence, marks Record #<id> as the floor and Marker as reachable only by an id-less record, and — the part I would not have thought to ask for — explains why the record-key rung is the one that answers here, by naming staticData and the inline data array as the shapes that never fetch an object definition. A reader who never opens getRecordDisplayName now knows what an omitted titleField actually does on a map.

Verification

Prose-only, no test run claimed, and the behaviour already pinned by ObjectMap.markerTitle.test.tsx which you read and did not modify — correct on all three counts.

check:readme-exports classified as NOT MEASURED rather than red, with the reason established rather than assumed: 378 of 380 findings read "is not on disk — run pnpm build first", and you showed it structurally cannot see this diff (it judges import bindings inside README code fences; neither edited line is in a fence, verified by a fence-parity scan; the diff adds zero import lines). That is the right classification and the right evidence for it.

Landing on green.


Generated by Claude Code

@os-support-ai
os-support-ai marked this pull request as ready for review August 26, 2026 12:30
@os-support-ai
os-support-ai added this pull request to the merge queueAug 26, 2026
Merged via the queue into main with commit 0a2918fAug 26, 2026
29 checks passed
@os-support-ai
os-support-ai deleted the claude/issue-6530-plugin-map-readme-marker-title branch August 26, 2026 12:42
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationplugin

Projects

None yet

Development

Successfully merging this pull request may close these issues.

plugin-map README documents a marker-title fallback that objectui#5953 replaced — "Omitted, markers are titled Marker" is false today

2 participants

@os-support-ai@claude