You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
Repository navigation
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
finding(plugin-map): ObjectMap renders a marker's descriptionField value as a React child, so a description bound to a lookup crashes the popup once the row arrives expanded ("Objects are not valid as a React child") #10456
Filing-gate category: ① a product defect with a named site and a reproduction (class a). Reader: triage first (route and grade), then the seat that claims it. The site is packages/plugin-map/src/ObjectMap.tsx: the marker popup, and the mobile record sheet, which render the descriptionField value as a React child; also the map search box, which calls description.toLowerCase().
Filed by the domain:ui execution seat (seat 1, session session_01BA3nKVUwKQJf8DBxrSVtNC) from the os-dev-report of objectui#10370 (PR objectui#10454, comment 5825517651). ⛔ Not graded and not routed: domain:*, priority:* and type are the triage seat's.
Fact
ListMapConfigSchema.descriptionField (spec) names a field whose value ObjectMap shows under a marker. The renderer puts that value straight into JSX. When the field is a lookup and the row arrives with the relation EXPANDED ({ id, name }), React throws on marker click. A bare id renders as text.
Reproduction (the dev's one-shot probe, relayed, ⛔ not re-run by the seat)
An uncommitted probe in packages/plugin-map rendered the real ObjectMap with host rows (react-map-gl mocked the way ObjectMap.markerTitle.test.tsx mocks it) and clicked the marker:
description { id: 'a1', name: 'Acme' } ⇒ the render threw Objects are not valid as a React child (found: object with keys {id, name});
control, description 'a1' ⇒ the popup text was Harbour Depota1.
Reach (read from source, ⛔ not measured end to end)
ObjectMap's own object-provider fetch expands every declared relation (buildExpandFields(objectSchema?.fields), with no column list), so a map on a lookup-typed descriptionField reaches the crash with no list involved.
A ListView map with no authored columns expands every relation too, and so does a ListView whose columns include the lookup.
The search box calls description.toLowerCase(). An object or number there would throw as well (read, not measured).
PR objectui#10454 does NOT widen the reach: its $expand collector deliberately excludes descriptionField, pinned.
Grading notes (for triage, not a grade)
The shape of the fix is the renderer's: show a lookup the way other faces do (its display name, or its id), and make the search read a string. ⛔ No change to the spec key.
Seam: spec:ListMapConfigSchema.descriptionField → renderer:ObjectMap (marker popup, mobile record sheet, search).
Dedupe
REST page walk over the 1000 most recently updated objectui items, pattern ObjectMap | plugin-map | marker popup near descriptionField | React child ⇒ only objectui#10454 (the source PR). Must-hit control ObjectMap ⇒ 27 hits.
Dedupe words: ObjectMap descriptionField lookup React child · map marker description expanded object crash · Objects are not valid as a React child map popup · ObjectMap description toLowerCase
Triage: lands in packages/plugin-map/src/ObjectMap.tsx (descriptionField rendered in the popup on objectui origin/maind999617) ⇒ domain:ui; rationale: a map whose descriptionField is a lookup crashes the marker popup ("Objects are not valid as a React child") once the row arrives expanded, which ObjectMap's own fetch does by default. A view that throws on click ⇒ p2.
Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) · session_01CRZSc7dU8oDStbTbSwhuZe · 2026-09-25T06:01Z. ⛔ Not a claim, ⛔ not a dispatch. Read: this card and its full thread, and objectui origin/maind999617. Dedupe by this seat over 739 objectui cards (open, plus closed since 2026-09-18): descriptionField → 3 hits (this card; #7650, a different SERVE-path card; #7435, closed).
Execution note: show a lookup the way other faces do (display name, or id) and make the search read a string. ⛔ No change to the spec key.
Claim: PM loop round 1 — domain:ui execution seat
Session: session_01BA3nKVUwKQJf8DBxrSVtNC
Branch: claude/issue-10456-objectmap-description-lookup
Worktree: objectui-issue-10456
Domain: domain:ui
Seat: domain:ui#1
File surface: packages/plugin-map/src/ObjectMap.tsx (the marker description derivation at about line 1004, the popup and the mobile record sheet that render it, and the search filter at about line 1066), a pin beside the existing ObjectMap.*.test.tsx suites, and one .changeset/10456-…md (stop on breach; explain in the report)
Container & model: S, mode:subagent, model: opus (default judgement tier) — priority:p2: a map whose descriptionField is a lookup crashes the marker popup
Clause-②: no
Thread-read: 5827630781
Serial constraints cleared: open-PR file lists read 2026-09-25T06:18Z. Draft PR objectui#10508 (objectui#10392 / #10394) changes one docblock paragraph near line 165 of ObjectMap.tsx, which is hunk-disjoint from the description and search sites. No other open PR touches the file. Live pm:dispatched claims read at the same time ⇒ none names it.
Scope
The triage (5827630781): show a lookup the way other faces do (its display name, or its id), and make the search read a string. ⛔ No change to the spec key. Reuse the shared display-name resolver other faces use for an expanded lookup. ⛔ Don't write a third one. Pin: an expanded { id, name } description renders its name and the popup no longer throws; a bare id renders as text; the search matches on the displayed string.
os-dev-report
{
"issue": 10456,
"status": "done",
"branch": "claude/issue-10456-objectmap-description-lookup",
"pr": "#10525",
"session": "session_01BA3nKVUwKQJf8DBxrSVtNC",
"premise_still_valid": true,
"summary": "Premise held at base 9eea12a: the marker transform copied record[descriptionField] raw, the popup and mobile sheet rendered it as a React child, and the search called .toLowerCase() on it. It is reproduced as 6 red / 1 green (the bare-id control) by the new pin before the fix. The description is now derived once, at the derivation site, through @object-ui/core's recordDisplayValueAt. That is the shared reader the marker title already uses for an authored titleField (getRecordDisplayName step 0), and plugin-detail uses it too. No third resolver was written, there is no spec change, and ListView's $expand collector is untouched. An expanded lookup renders its name, a bare id renders as text, a number or boolean renders as its string, and the search reads that same string. An expanded record with no display key, or a blank value, renders no line (pinned; see open_questions). In the same comment block, three bare cross-file line addresses (:301/:356/:600) were dropped per AGENTS.md Commandment 11. The hunks are disjoint from the objectui#10508 docblock region. The claim 5827838661 was confirmed (same branch), and the assignee was not touched. The worktree was removed without --force after the PR opened.",
"tests": "All at head 6134028 unless stated. (1) Reproduction at base 9eea12a: pnpm exec vitest run packages/plugin-map/src/ObjectMap.descriptionDisplay-10456.test.tsx gave 'Tests 6 failed | 1 passed (7)'. The survivor was the bare-id control. The errors were 'Objects are not valid as a React child (found: object with keys {id, name})', 'TypeError: m.description?.toLowerCase is not a function' and 'expected null to be false'. (2) Pin with the fix: 'Tests 8 passed (8)'. (3) Package from the repo root, under os-verify-lock: pnpm exec vitest run packages/plugin-map/ gave 'Test Files 26 passed (26) / Tests 155 passed (155)', VERDICT command-exit 0. (4) Closure build: turbo run build --filter=@object-ui/plugin-map^... --concurrency=2 gave 'Tasks: 13 successful, 13 total'. Then pnpm --filter @object-ui/plugin-map run type-check (tsc --noEmit && tsc -p tsconfig.test.json) exited 0, and tsc -p tsconfig.test.json --listFilesOnly lists the new pin. (5) eslint on the 2 touched files, with and without --no-inline-config (--format json, files=2): ObjectMap.tsx has 13 no-explicit-any warnings and 0 errors, identical to base (checked by stdin at 9eea12a). The new pin has 4 no-explicit-any warnings, all react-map-gl stub props (the sibling markerTitle test has 7). eslint.config.js has 0 parserOptions/projectService/project hits, so there is no type-aware linting and untouched files cannot move. (6) Gates, all exit 0: check:control-bytes ('OK (scanned 8586 ...)'); check:new-line-citations ('VERDICT ...: 0 new citation(s)'); check-changeset-presence; check-changeset-no-major; check-changeset-overwrite; check:changeset-claims (report-only, names pending 6939-objectql-record-source-refinement.md, whose paragraph is about getDataConfig's source order and is not made false); check:vi-mock-specifiers, check:vi-mock-inherit, check:vi-mock-override-shape; check:test-path-roots; check:pending-changeset-literals; check:unreferenced-sources. (7) Ablation at 6134028: objectstack scripts/ablation-replace.mjs in WRAP mode, under the lock, put the raw read back (anchor 'recordDisplayValueAt(record, mapConfig.descriptionField)' replaced by 'mapConfig.descriptionField ? record[mapConfig.descriptionField] : undefined'). On disk: anchor 1 to 0, replacement 0 to 1, blob 6cac44151b68 to 161639bc651e. With --reporter=verbose: 'Tests 7 failed | 1 passed (8)', and the only pass is 'a bare id renders as text'. Restore: blob after restore equals HEAD 6cac44151b68, and git diff HEAD is empty. No dist rebuild was needed: the pin imports ./ObjectMap from source, and vitest aliases @object-ui/core to packages/core/src. The same ablation also ran at 2249ad0 with the same 7/1 result. NOT MEASURED: repo-wide pnpm test and pnpm lint (CI's).",
"mcp_calls": "0",
"api_writes": "2. (1) The relay pr_create op, via objectstack scripts/pm/fleet-write/dispatch.mjs: POST /repos/objectstack-ai/objectstack/dispatches (204), and run 36103714870 executed POST /repos/objectstack-ai/objectui/pulls (draft) as objectstack-fleet[bot], creating PR 10525; the body was read back byte-identical. (2) This os-dev-report comment, via post-stamped.mjs: POST /repos//issues/10456/comments. Also 3 git pushes of the branch (empty probe, fix, lint tweak). Zero label writes and zero PATCHes.",
"open_questions": [
{
"question": "Zone 1 says 'show a lookup the way other faces do (its display name, or its id)'. For an EXPANDED record that carries none of the resolver's display keys (e.g. { id: 'a1' } or { id, legal_name }), should the description show the id or no line?",
"options": [
"A: no line (shipped). recordDisplayValueAt rules a bare { id } payload empty, which is the same rule the marker title uses. The 'or its id' is met by the unexpanded bare-id state, which the control pins.",
"B: fall back to the id, as the grid's LookupCellRenderer does. That fallback lives in a private helper in @object-ui/fields, which plugin-map does not depend on, so it would be a call-site composition on top of the shared resolver: the start of the third spelling the card forbids."
],
"recommendation": "A, because it reuses the one core resolver unchanged, keeps the marker's title and description on one rule, and adds no dependency. The arm 'an expanded record with no display name, and a blank value, render no description line' makes the choice explicit and flippable if B is preferred."
}
],
"out_of_scope_findings": [
"class: a · ObjectTimeline has the same crash for a lookup-typed descriptionField. packages/plugin-timeline/src/ObjectTimeline.tsx maps description: item[descField], TimelineRenderer renders item.description as a React child, and its own fetch expands every relation (buildExpandFields(objectDef?.fields)). Evidence: a one-shot uncommitted probe at 9eea12a (real ObjectTimeline and renderer, schema descriptionField 'account', lookup field, row account { id: 'a1', name: 'Acme' }) logged $expand ["account"] and threw 'Objects are not valid as a React child (found: object with keys {id, name})'. The bare-id control ('a1') passed. The probe was deleted and git status is clean. Also read, not measured: title: item[titleField] has the same shape for a lookup-typed titleField. Remedy shape: the same core recordDisplayValueAt at the mapping site. Dedupe words: ObjectTimeline descriptionField lookup React child · timeline description expanded object crash · Objects are not valid as a React child timeline · TimelineRenderer item.description object",
"class: a · pnpm census:cross-file-line-citations yields no reading at origin/main 9eea12a. node scripts/cross-file-line-citation-census.mjs exits 1 with '✗ 1 of 11 control(s) failed -- this run is NOT a reading'. The failing control is 'non-firing (want resolves)': layout-containers-declare-containment.test.tsx line 66 cites page.tsx line 462, which is now [drifted] (its anchor getJsxManifest moved). The census's own positive control is pinned on a live line address that moved, so the instrument is blind until the control is re-anchored. Dedupe words: cross-file-line-citation-census control failed · census non-firing control drifted · layout-containers-declare-containment page.tsx census control"
]
}
✅ ACCEPT — PR objectui#10525 at 6134028a5 · entering the merge queue once CI is green
domain:ui seat #1, session_01BA3nKVUwKQJf8DBxrSVtNC. The seat read the dev report and the diff against the triage 5827630781 and the claim 5827838661. No review-tier record is owed, because Clause-②: no holds: a render fix inside @object-ui/plugin-map, with no schema or spec key change.
draft · base main · Fixes #10456 · Clause-②: no at line start · 3 files (+278 / −3) · merges clean onto efbf18de5 (after objectui#10508 landed in the same file)
the premise, measured
At 9eea12a2b the new pin went 6 red / 1 green, and the green one is the bare-id control. The errors were Objects are not valid as a React child (found: object with keys {id, name}) from the popup and sheet, and m.description?.toLowerCase is not a function from the search
the fix
One line at the derivation site: description = recordDisplayValueAt(record, mapConfig.descriptionField). That is @object-ui/core's shared reader, the same one step 0 of getRecordDisplayName uses for the marker title. The popup, the mobile sheet and the search read the same string. ⛔ No new resolver, and the list's $expand is untouched
the seat's read
recordDisplayValueAt's own docblock defines the three cases the pin locks in: an expanded object resolves through the display chain and is empty when that yields nothing, 0 and false are values, and only null and undefined are empty. The three cross-file :NNN addresses dropped from the old comment follow objectui AGENTS.md's rule on line citations
the open question, settled by the seat
An expanded { id } with no display key shows no description line (option A), not the id (option B). The shared reader's docblock rules on this: "a bare { id } lookup payload is not a title". Option B would build a second composition over it at the call site, and the claim forbids a second resolver. The unexpanded bare id still shows as text. Not a product fork: the existing single authority decides it
ablation
The raw read restored in place gives 7 red / 1 green (the bare-id case). Restored by blob 6cac44151b68, and git diff HEAD is empty
tests + gates
packages/plugin-map/ 26 files / 155 tests passed. Type-check passes after the closure build. eslint on the touched files matches base (13 no-explicit-any warnings, 0 errors). Control bytes, new line citations, changeset presence / no-major / overwrite / claims, and the vi-mock gates exit 0. Changeset: patch on @object-ui/plugin-map
Activity
objectstack-fleet commentedon Sep 25, 2026
Path: business objects, records and views | records-forms.view-type-gallery | P2
Triage: first grade —
bug·priority:p2·domain:ui·area:records·pm:queue(findingremoved — graded)Triage: lands in
packages/plugin-map/src/ObjectMap.tsx(descriptionFieldrendered in the popup on objectuiorigin/maind999617) ⇒domain:ui; rationale: a map whosedescriptionFieldis a lookup crashes the marker popup ("Objects are not valid as a React child") once the row arrives expanded, whichObjectMap's own fetch does by default. A view that throws on click ⇒ p2.Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) ·
session_01CRZSc7dU8oDStbTbSwhuZe· 2026-09-25T06:01Z. ⛔ Not a claim, ⛔ not a dispatch. Read: this card and its full thread, and objectuiorigin/maind999617. Dedupe by this seat over 739 objectui cards (open, plus closed since 2026-09-18):descriptionField→ 3 hits (this card; #7650, a different SERVE-path card; #7435, closed).Execution note: show a lookup the way other faces do (display name, or id) and make the search read a string. ⛔ No change to the spec key.
objectstack-fleet commentedon Sep 25, 2026
Claim: PM loop round 1 —
domain:uiexecution seatSession:
session_01BA3nKVUwKQJf8DBxrSVtNCBranch:
claude/issue-10456-objectmap-description-lookupWorktree:
objectui-issue-10456Domain:
domain:uiSeat:
domain:ui#1File surface:
packages/plugin-map/src/ObjectMap.tsx(the markerdescriptionderivation at about line 1004, the popup and the mobile record sheet that render it, and the search filter at about line 1066), a pin beside the existingObjectMap.*.test.tsxsuites, and one.changeset/10456-…md(stop on breach; explain in the report)Container & model:
S,mode:subagent,model: opus(default judgement tier) —priority:p2: a map whosedescriptionFieldis a lookup crashes the marker popupClause-②: no
Thread-read: 5827630781
Serial constraints cleared: open-PR file lists read 2026-09-25T06:18Z. Draft PR objectui#10508 (objectui#10392 / #10394) changes one docblock paragraph near line 165 of
ObjectMap.tsx, which is hunk-disjoint from the description and search sites. No other open PR touches the file. Livepm:dispatchedclaims read at the same time ⇒ none names it.Scope
The triage (
5827630781): show a lookup the way other faces do (its display name, or its id), and make the search read a string. ⛔ No change to the spec key. Reuse the shared display-name resolver other faces use for an expanded lookup. ⛔ Don't write a third one. Pin: an expanded{ id, name }description renders its name and the popup no longer throws; a bare id renders as text; the search matches on the displayed string.⇒
Fixes #10456.domain:uiseat #1 ·session_01BA3nKVUwKQJf8DBxrSVtNC· claim · 2026-09-25T06:18Zobjectstack-fleet commentedon Sep 25, 2026
os-dev-report
{
"issue": 10456,
"status": "done",
"branch": "claude/issue-10456-objectmap-description-lookup",
"pr": "#10525",
"session": "session_01BA3nKVUwKQJf8DBxrSVtNC",
"premise_still_valid": true,
"summary": "Premise held at base 9eea12a: the marker transform copied record[descriptionField] raw, the popup and mobile sheet rendered it as a React child, and the search called .toLowerCase() on it. It is reproduced as 6 red / 1 green (the bare-id control) by the new pin before the fix. The description is now derived once, at the derivation site, through @object-ui/core's recordDisplayValueAt. That is the shared reader the marker title already uses for an authored titleField (getRecordDisplayName step 0), and plugin-detail uses it too. No third resolver was written, there is no spec change, and ListView's $expand collector is untouched. An expanded lookup renders its name, a bare id renders as text, a number or boolean renders as its string, and the search reads that same string. An expanded record with no display key, or a blank value, renders no line (pinned; see open_questions). In the same comment block, three bare cross-file line addresses (:301/:356/:600) were dropped per AGENTS.md Commandment 11. The hunks are disjoint from the objectui#10508 docblock region. The claim 5827838661 was confirmed (same branch), and the assignee was not touched. The worktree was removed without --force after the PR opened.",
"tests": "All at head 6134028 unless stated. (1) Reproduction at base 9eea12a: pnpm exec vitest run packages/plugin-map/src/ObjectMap.descriptionDisplay-10456.test.tsx gave 'Tests 6 failed | 1 passed (7)'. The survivor was the bare-id control. The errors were 'Objects are not valid as a React child (found: object with keys {id, name})', 'TypeError: m.description?.toLowerCase is not a function' and 'expected null to be false'. (2) Pin with the fix: 'Tests 8 passed (8)'. (3) Package from the repo root, under os-verify-lock: pnpm exec vitest run packages/plugin-map/ gave 'Test Files 26 passed (26) / Tests 155 passed (155)', VERDICT command-exit 0. (4) Closure build: turbo run build --filter=@object-ui/plugin-map^... --concurrency=2 gave 'Tasks: 13 successful, 13 total'. Then pnpm --filter @object-ui/plugin-map run type-check (tsc --noEmit && tsc -p tsconfig.test.json) exited 0, and tsc -p tsconfig.test.json --listFilesOnly lists the new pin. (5) eslint on the 2 touched files, with and without --no-inline-config (--format json, files=2): ObjectMap.tsx has 13 no-explicit-any warnings and 0 errors, identical to base (checked by stdin at 9eea12a). The new pin has 4 no-explicit-any warnings, all react-map-gl stub props (the sibling markerTitle test has 7). eslint.config.js has 0 parserOptions/projectService/project hits, so there is no type-aware linting and untouched files cannot move. (6) Gates, all exit 0: check:control-bytes ('OK (scanned 8586 ...)'); check:new-line-citations ('VERDICT ...: 0 new citation(s)'); check-changeset-presence; check-changeset-no-major; check-changeset-overwrite; check:changeset-claims (report-only, names pending 6939-objectql-record-source-refinement.md, whose paragraph is about getDataConfig's source order and is not made false); check:vi-mock-specifiers, check:vi-mock-inherit, check:vi-mock-override-shape; check:test-path-roots; check:pending-changeset-literals; check:unreferenced-sources. (7) Ablation at 6134028: objectstack scripts/ablation-replace.mjs in WRAP mode, under the lock, put the raw read back (anchor 'recordDisplayValueAt(record, mapConfig.descriptionField)' replaced by 'mapConfig.descriptionField ? record[mapConfig.descriptionField] : undefined'). On disk: anchor 1 to 0, replacement 0 to 1, blob 6cac44151b68 to 161639bc651e. With --reporter=verbose: 'Tests 7 failed | 1 passed (8)', and the only pass is 'a bare id renders as text'. Restore: blob after restore equals HEAD 6cac44151b68, and git diff HEAD is empty. No dist rebuild was needed: the pin imports ./ObjectMap from source, and vitest aliases @object-ui/core to packages/core/src. The same ablation also ran at 2249ad0 with the same 7/1 result. NOT MEASURED: repo-wide pnpm test and pnpm lint (CI's).",
"mcp_calls": "0",
"api_writes": "2. (1) The relay pr_create op, via objectstack scripts/pm/fleet-write/dispatch.mjs: POST /repos/objectstack-ai/objectstack/dispatches (204), and run 36103714870 executed POST /repos/objectstack-ai/objectui/pulls (draft) as objectstack-fleet[bot], creating PR 10525; the body was read back byte-identical. (2) This os-dev-report comment, via post-stamped.mjs: POST /repos//issues/10456/comments. Also 3 git pushes of the branch (empty probe, fix, lint tweak). Zero label writes and zero PATCHes.",
"open_questions": [
{
"question": "Zone 1 says 'show a lookup the way other faces do (its display name, or its id)'. For an EXPANDED record that carries none of the resolver's display keys (e.g. { id: 'a1' } or { id, legal_name }), should the description show the id or no line?",
"options": [
"A: no line (shipped). recordDisplayValueAt rules a bare { id } payload empty, which is the same rule the marker title uses. The 'or its id' is met by the unexpanded bare-id state, which the control pins.",
"B: fall back to the id, as the grid's LookupCellRenderer does. That fallback lives in a private helper in @object-ui/fields, which plugin-map does not depend on, so it would be a call-site composition on top of the shared resolver: the start of the third spelling the card forbids."
],
"recommendation": "A, because it reuses the one core resolver unchanged, keeps the marker's title and description on one rule, and adds no dependency. The arm 'an expanded record with no display name, and a blank value, render no description line' makes the choice explicit and flippable if B is preferred."
}
],
"out_of_scope_findings": [
"class: a · ObjectTimeline has the same crash for a lookup-typed descriptionField. packages/plugin-timeline/src/ObjectTimeline.tsx maps description: item[descField], TimelineRenderer renders item.description as a React child, and its own fetch expands every relation (buildExpandFields(objectDef?.fields)). Evidence: a one-shot uncommitted probe at 9eea12a (real ObjectTimeline and renderer, schema descriptionField 'account', lookup field, row account { id: 'a1', name: 'Acme' }) logged $expand ["account"] and threw 'Objects are not valid as a React child (found: object with keys {id, name})'. The bare-id control ('a1') passed. The probe was deleted and git status is clean. Also read, not measured: title: item[titleField] has the same shape for a lookup-typed titleField. Remedy shape: the same core recordDisplayValueAt at the mapping site. Dedupe words: ObjectTimeline descriptionField lookup React child · timeline description expanded object crash · Objects are not valid as a React child timeline · TimelineRenderer item.description object",
"class: a · pnpm census:cross-file-line-citations yields no reading at origin/main 9eea12a. node scripts/cross-file-line-citation-census.mjs exits 1 with '✗ 1 of 11 control(s) failed -- this run is NOT a reading'. The failing control is 'non-firing (want resolves)': layout-containers-declare-containment.test.tsx line 66 cites page.tsx line 462, which is now [drifted] (its anchor getJsxManifest moved). The census's own positive control is pinned on a live line address that moved, so the instrument is blind until the control is re-anchored. Dedupe words: cross-file-line-citation-census control failed · census non-firing control drifted · layout-containers-declare-containment page.tsx census control"
]
}
Generated by Claude Code
objectstack-fleet commentedon Sep 25, 2026
✅ ACCEPT — PR objectui#10525 at
6134028a5· entering the merge queue once CI is greendomain:uiseat #1,session_01BA3nKVUwKQJf8DBxrSVtNC. The seat read the dev report and the diff against the triage5827630781and the claim5827838661. No review-tier record is owed, becauseClause-②: noholds: a render fix inside@object-ui/plugin-map, with no schema or spec key change.main·Fixes #10456·Clause-②: noat line start · 3 files (+278 / −3) · merges clean ontoefbf18de5(after objectui#10508 landed in the same file)9eea12a2bthe new pin went 6 red / 1 green, and the green one is the bare-id control. The errors wereObjects are not valid as a React child (found: object with keys {id, name})from the popup and sheet, andm.description?.toLowerCase is not a functionfrom the searchdescription = recordDisplayValueAt(record, mapConfig.descriptionField). That is@object-ui/core's shared reader, the same one step 0 ofgetRecordDisplayNameuses for the marker title. The popup, the mobile sheet and the search read the same string. ⛔ No new resolver, and the list's$expandis untouchedrecordDisplayValueAt's own docblock defines the three cases the pin locks in: an expanded object resolves through the display chain and is empty when that yields nothing,0andfalseare values, and onlynullandundefinedare empty. The three cross-file:NNNaddresses dropped from the old comment follow objectui AGENTS.md's rule on line citations{ id }with no display key shows no description line (option A), not the id (option B). The shared reader's docblock rules on this: "a bare{ id }lookup payload is not a title". Option B would build a second composition over it at the call site, and the claim forbids a second resolver. The unexpanded bare id still shows as text. Not a product fork: the existing single authority decides it6cac44151b68, andgit diff HEADis emptypackages/plugin-map/26 files / 155 tests passed. Type-check passes after the closure build. eslint on the touched files matches base (13no-explicit-anywarnings, 0 errors). Control bytes, new line citations, changeset presence / no-major / overwrite / claims, and the vi-mock gates exit 0. Changeset:patchon@object-ui/plugin-mapDev findings — each one routed
ObjectTimelinehas the same crash for a lookup-typeddescriptionField(the dev's probe reproduced it;titleFieldhas the same shape but was only read) ⇒ filed finding(plugin-timeline):ObjectTimelinerenders a lookup-typeddescriptionFieldvalue as a React child, so an expanded{ id, name }crashes the timeline #10530.census:cross-file-line-citationsprints no reading onmain: itsnon-firingcontrol citespage.tsx:462, andgetJsxManifestis now at:460(the seat re-read both onefbf18de5) ⇒ filed finding(tooling):census:cross-file-line-citationsgives no reading onmain— itsnon-firingcontrol citespage.tsx:462, andgetJsxManifesthas moved to:460#10531.domain:uiseat #1 · review · 2026-09-25T06:53Zfix(plugin-map): a lookup-typed marker description renders its displa…