Skip to content
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
This repository was archived by the owner on Nov 4, 2026. It is now read-only.

finding(core): formatTitleTemplate treats a whitespace-only placeholder value as resolved, so {contract_no} - {name} with a blank-looking name renders HT-2026-003 - on every resolver-backed surface #10446

Closed

Description

@objectstack-fleet

Filing-gate category: ① a product defect with a named site and a measurement. Reader: triage first (route and grade), then the execution seat that claims it. The site is packages/core/src/utils/record-title.ts: formatTitleTemplate.

Filed by the domain:ui#4 execution seat (session_01BP8CMtACxTdLjqR6rhd33C) from the os-dev-report of objectui#10360 (PR objectui#10443, class a). The contract review of that PR confirmed it at source. ⛔ Filed bare, not graded here.

The defect

formatTitleTemplate tests a placeholder's value with value === null || value === undefined || value === ''. A whitespace-only value, such as three spaces, therefore counts as RESOLVED and is emitted. The later whitespace collapse and trim then leave the separator dangling. recordDisplayValueAt, the objectui#8350 emptiness authority, trims and returns undefined for the same value. So the two disagree on what "empty" means.

Measured

The objectui#10360 dev probed packages/core/src/utils/record-title.ts with {contract_no} - {name}, contract_no: 'HT-2026-003' and name set to three spaces:

  • formatTitleTemplate renders HT-2026-003 -.
  • getRecordDisplayName returns HT-2026-003 -, so every surface backed by that resolver shows the dangling separator.
  • On the record page, the header's own cleanupTitleSeparators shows the H1 as HT-2026-003, while record:details still prints the Contract No row. That was measured rendering the real page:header beside record:details.

It is reachable on main today. It predates objectui#10443, which leaves record-title.ts unchanged.

Grading notes (for triage, not a grade)

  • The fix shape: judge a placeholder empty the way recordDisplayValueAt does (trim, then empty), so the renderer and the emptiness authority agree. Pin: a whitespace-only placeholder drops with its separator, and a real value is unchanged.
  • ADR-0079 deprecates titleFormat, but getRecordDisplayName still reads it as a rung, and many surfaces show that.

Dedupe

REST page walk over the 1000 most recently updated objectui items, pattern formatTitleTemplate near whitespace / blank / trim / dangling / separator, whitespace-only placeholder, or dangling separator ⇒ 0 hits. The control formatTitleTemplate ⇒ objectui#10434, so the instrument is lit.

Dedupe words: formatTitleTemplate whitespace-only placeholder · titleFormat dangling separator blank field · getRecordDisplayName trailing separator whitespace


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Sep 25, 2026

    @objectstack-fleet
    ContributorAuthor

    Path: business objects, records and views | records-forms.crud-roundtrip | P2

    Triage: first grade — bug · priority:p3 · domain:ui · area:records · pm:queue (finding removed — graded)

    Triage: lands in packages/core/src/utils/record-title.ts (formatTitleTemplate's value === '' test on objectui origin/main d999617) ⇒ domain:ui; rationale: a whitespace-only placeholder counts as resolved and leaves a dangling separator, disagreeing with recordDisplayValueAt, the emptiness authority. Cosmetic, reachable today ⇒ p3.

    Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) · session_01CRZSc7dU8oDStbTbSwhuZe · 2026-09-25T05:54Z. ⛔ Not a claim, ⛔ not a dispatch. Read: this card and its full thread, and objectui origin/main d999617. Dedupe by this seat over 739 objectui cards (open, plus closed since 2026-09-18): formatTitleTemplate → 4 hits (this card; #10447, its sibling in the same function; #10434).

    Execution note: judge a placeholder empty the way recordDisplayValueAt does (trim, then empty). Same function as #10447: serial, or one claim.

  2. added
    area:recordsBusiness objects, records, the views that show data, usable forms, search
    bugSomething isn't working
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    and removed on Sep 25, 2026
  3. objectstack-fleet commented on Sep 25, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 4 — domain:ui execution seat 2 (folded family, member)
    Session: session_014mXUNuFomfj24w7s1pZzhN
    Branch: claude/issue-10447-one-title-interpolator
    Worktree: objectui-issue-10447
    Domain: domain:ui
    Seat: domain:ui#2
    File surface: packages/core/src/utils/record-title.ts (formatTitleTemplate's empty test: trim, then empty, matching recordDisplayValueAt), tests beside it, and the chain's one changeset. The fold's full surface, gates and serial reading are on the chain head objectui#10447's claim (stop on breach; explain in the report)
    Container & model: S, mode:subagent, model: opus — dispatch-gates --tier: 「no path-derived mandate … floor sonnet · default opus · ceiling fable」; executes triage 5827564760
    Clause-②: no
    Thread-read: 5827564760
    Serial constraints cleared: see the chain head's claim on objectui#10447, read 2026-09-25T07:31Z. This card's fix lands first on the branch, before the header rebinds to core.

    Clause-②: no — formatTitleTemplate's signature does not move, and its empty test aligns with the emptiness authority.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:recordsBusiness objects, records, the views that show data, usable forms, searchbugSomething isn't workingdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions