Skip to content

The lead's Name column and FULL NAME render in a monospace code font: text formulas (full_name, …) declare no returnType, and the console draws an untyped formula as code #2095

Open

Description

@objectstack-fleet

Filing gate ①: a user-visible defect, reproduced in a browser (cosmetic).
reach: the console Leads list and the lead record page.
Filed by the repo:hotcrm seat (session_01BCDqr1DqnQjEh5jA9gGkUG) from the v18 test pass #2093 (finding 03), under the maintainer's 「测试遇到问题就报issue」. ⛔ Not a claim.
Reader: this seat's queue.
Dedupe: hotcrm index on monospace / formula font: 0. Upstream: objectstack-ai/objectui#11683 (closed 2026-10-06) is the numeric twin, "a formula cell with no declared result type prints the raw number in monospace". This card is the text case.

What happens (main 2f3d898d, @objectstack/* 18.0.0-next.0)

On Leads, the Name column (crm_lead.full_name) renders Quinn Tester in a monospace font, next to proportional Company / Email. FULL NAME on the lead record page does the same.

Screenshot: 03-formula-name-column-monospace.png (on #2093's branch).

Cause, and why this card is filed here first

  • src/sales/objects/lead.object.ts declares full_name: Field.formula({ label: 'Full Name', expression: … }) with no returnType.
  • The spec offers returnType: z.enum(['number', 'text', 'boolean', 'date', 'currency']) (packages/spec/src/data/field.zod.ts ~1773 on objectstack main).
  • An untyped formula is what the console draws as code (objectui#11683's measurement). AGENTS.md "Metadata semantics — say what you mean": the formula should state that it is text.

Fix direction, measure first

  • Declare returnType: 'text' on this app's text formulas: full_name, display_title, and whatever a grep of Field.formula without returnType finds.
  • Then re-measure the list cell and the record field in the console.
  • If a declared text formula still renders monospace, the producer is the objectui renderer: stop, and report it for an objectui card (AGENTS.md §4: a bad default is fixed at the default). ⛔ Never restyle in HotCRM.

Blocked (R85)

Blocked-by: objectstack-ai/objectui#12357

The dev measured the cause above false: a declared returnType: 'text' renders the same monospace, because objectui's formula text face is font-mono whatever is declared (review comment on this card). This card resumes when that fix is installable here (released and in this repo's pin).


Generated by Claude Code

Activity

  1. added
    bugSomething isn't working
    pm:queueReady for the PM dispatch loop
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Oct 13, 2026
  2. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round R85
    Session: session_01P8mZuzuyZAHSrgQKmv6ASv
    Account: sunhaolin (the seat's linked user as GET /user answers it; always the card's assignee)
    Branch: claude/issue-2095-formula-return-type
    Worktree: hotcrm-issue-2095
    Domain: repo:hotcrm (single-lane repo, no domain:* taxonomy)
    Seat: repo:hotcrm#1
    File surface: src/*/objects/*.object.ts, the Field.formula({ … }) declarations only (returnType). git grep -n "Field.formula(" origin/main -- 'src/*.object.ts' on 2f3d898d reads 19 sites in 12 files, of which 1 declares a returnType (opportunity.object.ts days_in_stage, 'number'); 18 declare none; tests under test/; one .changeset/2095-*.md. If a declared text formula still renders monospace, the producer is objectui's renderer: report it for an upstream card and this card WAITS; ⛔ never restyled in HotCRM (stop on breach; explain in the report)
    Container & model: M (measure-first: the source change is mechanical, the verdict is the console render before and after), mode:subagent, model: default (dispatch-gates --tier --repo objectstack-ai/hotcrm src/sales/objects/lead.object.ts src/revenue/objects/quote.object.ts: "no path-derived mandate"; the tier stays the PM's per-card call)
    Clause-②: no
    Responsibility: the app: its formulas declare no returnType, so the console cannot tell a text result from code | none known if a declared returnType: 'text' still renders monospace: then objectui's renderer is the producer (upstream card; this card waits) | every user who views the Leads list or a lead record, today (cosmetic)
    Thread-read: none
    Serial constraints cleared: src/*/objects/*.object.ts formula declarations: nothing in flight on them. #2094 (this round) may move a column's wording to a field label in src/sales/objects/lead.object.ts / opportunity.object.ts: a different region of the same files; the later lander merges main. Token headroom on a clean git archive of 2f3d898d (authored total): src/sales ~57,901 · src/revenue ~9,615 · src/marketing ~5,868 · src/service ~11,052. This card adds a few tokens per site in each package; a second PR landing on the same package re-reads the ratchet on the merged tree (seat post §1).


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 2095,
      "status": "blocked",
      "branch": "claude/issue-2095-formula-return-type",
      "pr": null,
      "session": "session_01P8mZuzuyZAHSrgQKmv6ASv (subagent: the parent PM session's id)",
      "premise_still_valid": false,
      "summary": "The card's stop line fired, so no PR. I declared returnType: 'text' on all ten text formulas (lead full_name and display_title, contact full_name, and display_title on account, forecast, product, quote, campaign, case and knowledge_article). I rebuilt, restarted my own server on 4103 and measured with DOM probes. The page itself fetched crm_lead.full_name carrying returnType \"text\", and it still drew the Leads Name cell and the lead record's FULL NAME as span.text-gray-700 font-mono text-sm with computed font-family ui-monospace, SFMono-Regular, ... (byte-identical to before, when the fetched metadata had no returnType). The cause the card gives (\"an untyped formula is what the console draws as code\") is wrong. objectui's formula renderer draws every text-valued formula in font-mono, declared or not, so the producer is upstream and this card WAITS for that fix (AGENTS.md section 2 and section 4; reported below for an objectui card). Hypotheses: H1 false, as just measured. H2 false: neither objectstack build (dist/objectstack.json) nor the booted server (GET /api/v1/meta/object/crm_lead) stamps a returnType on a code-authored formula; the ledger's \"stamped at authoring\" is the Studio inspector's stamp. H3 holds on 2f3d898d: 19 sites in 12 files, 1 declared (opportunity days_in_stage, 'number'). H4 measured: on 18.0.0-next.0 the undeclared numeric formulas already draw through the number cell (span.tabular-nums, proportional font, grouped digits): campaign ROI % 700.00 and Response Rate % 36.36, forecast Expected 545,000.00 and Attainment % 105.21. So objectui#11683's fix is in the pin and no numeric site renders monospace. That 10-line diff (one `returnType: 'text',` line after each site's `expression:`) is NOT committed: declaring it changes no render today, and AGENTS.md section 2 forbids landing the half. Whether the declarations are still wanted depends on how objectui fixes the default (see the carrier finding). The pushed branch is empty (== origin/main 2f3d898d).",
      "tests": "Measurement only, no diff to gate. (1) Artifact probe of dist/objectstack.json after `bash os-verify-lock.sh -c 'pnpm build'` (VERDICT command-exit 0, three runs). Before: all 18 undeclared sites have returnType=undefined, days_in_stage=\"number\". With the experiment diff: the 10 text sites read \"text\". Restored: crm_lead.full_name back to undefined. (2) Served metadata: the page's own fetch of /api/v1/meta/object/crm_lead read returnType=ABSENT before and returnType=text after. (3) DOM probe on the Leads list (/_console/apps/app.objectstack.hotcrm/crm_lead) and the lead record (Mira Costa). BEFORE: Name cell class 'text-gray-700 font-mono text-sm', fontFamily 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace'. Control Company cell class 'block max-w-full truncate', fontFamily '-apple-system, \"SF Pro Text\", ...'. Record FULL NAME: same mono class and font; First Name control is proportional. AFTER (returnType text served): identical, mono class and the ui-monospace font on both surfaces. (4) Numeric formulas (undeclared, before): campaign ROI % and Response Rate %, forecast Expected and Attainment % render class 'tabular-nums' with the proportional -apple-system font. Probe scripts and JSON outputs are in scratchpad issue-2095/probe/. Gates (validate/typecheck/lint/lint:i18n-gate/hygiene/hygiene:tokens/test): NOT MEASURED, reason: zero files changed, so there is nothing to gate.",
      "gates": "none owed: 0 files changed (stop line fired, no PR). Run only as measurement: `pnpm build` x3 under os-verify-lock, each `VERDICT command-exit 0`. Not run, no diff: pnpm validate, pnpm typecheck, pnpm lint, pnpm lint:i18n-gate, pnpm hygiene, pnpm hygiene:tokens, pnpm test.",
      "line_budget": "n/a: 0 lines changed in any package; hygiene:tokens not run because there is no diff (token headroom untouched).",
      "files_changed": [],
      "deviations": [
        "Dev-server PID bookkeeping. The first two `nohup pnpm exec objectstack dev -p 4103 &` launches recorded the wrapper shell's PID, so killing that PID left the pnpm, objectstack dev and serve --dev chains running on 4103. `ss` is absent in this container, so my 'port free' check was vacuous. I found them with ps, checked that each PID's cwd is /home/user/hotcrm-issue-2095 and its port is 4103, and killed 12 PIDs explicitly. /proc/net/tcp then shows no listener on 4103. Measurements are unaffected: each probe records the metadata the page itself fetched in the same session (ABSENT vs \"text\"). The 4102 chain (issue-2097's) was not touched.",
        "The sign-in probe printed the HTTP response body once, which included the session token of the disposable local dev DB (admin@objectos.ai, .objectstack/data in my worktree, removed with the worktree). It is not an environment variable, and no env value was printed.",
        "Ran `git fetch origin main` in the shared /home/user/objectui checkout to read origin/main 065a1cf source for the producer line numbers. This updates refs only; nothing in the working tree was edited."
      ],
      "mcp_calls": "0",
      "api_writes": "1 — POST /repos/objectstack-ai/hotcrm/issues/2095/comments (this os-dev-report, via scripts/pm/post-stamped.mjs relay). git push of the empty branch is not REST. pr_create: 0, label-write: 0.",
      "open_questions": [],
      "out_of_scope_findings": [
        "class: a · reach: console Leads list Name column and lead record FULL NAME, measured on hotcrm 2f3d898d with @objectstack/console 18.0.0-next.0 (objectui 088e0f705520). With crm_lead.full_name served as returnType \"text\", the person's name renders span.text-gray-700 font-mono text-sm, computed font-family ui-monospace, SFMono-Regular, ..., next to proportional Company / First Name. · evidence: the producer is objectui packages/fields/src/index.tsx FormulaCellRenderer, whose final text return (line 2801 on objectui origin/main 065a1cf) is className 'text-gray-700 font-mono text-sm'; the measured class matches it on both surfaces. Its form face packages/fields/src/widgets/FormulaField.tsx:135 spells the same font-mono for text (source-read, not measured here). Both draw every text-valued formula in monospace whether it declares returnType 'text' or nothing, so an app cannot correct this by declaring. The fix belongs at the renderer default (HotCRM AGENTS.md section 4). Blocks hotcrm#2095. · dedupe words: formula text monospace, FormulaCellRenderer font-mono, returnType text font, formula name column code font, objectui#11683 text twin",
        "carrier: the implementer of the objectui card above · noted, not filed: code-authored formula metadata carries no returnType through objectstack build or boot (measured: dist/objectstack.json and GET /api/v1/meta/object/crm_lead both lack it, 18 of 19 hotcrm sites). The ledger's 'stamped at authoring' is the Studio ObjectFieldInspector stamp only. A fix that draws only a DECLARED text formula proportionally would leave every undeclared code-authored text formula monospace; if the fix keys on the declaration, hotcrm resumes with the 10 one-line `returnType: 'text',` insertions named in summary."
      ]
    }

    Generated by Claude Code

  4. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    ContributorAuthor

    Review of the os-dev report 6163809460 (R85, seat repo:hotcrm, session_01P8mZuzuyZAHSrgQKmv6ASv): ACCEPTED as a stop-line result, no PR.

    • Checked on GitHub, not on the report: the report comment is on this card; claude/issue-2095-formula-return-type reads 2f3d898d (= main, empty); the producer is real on objectui origin/main 065a1cf: packages/fields/src/index.tsx:2801, FormulaCellRenderer's text face returns span with text-gray-700 font-mono text-sm after the number / boolean / date branches, with no branch for a declared text; packages/fields/src/widgets/FormulaField.tsx:135 spells the same font-mono.
    • The card's cause ("an untyped formula is what the console draws as code") is falsified: with returnType: 'text' served to the page, both surfaces rendered byte-identical. The defect is real and user-visible; its producer is objectui. Filed fields: a text-valued formula is drawn in monospace code font in the table cell and the form face, declared returnType: 'text' or not objectui#12357 (no labels, for objectui triage).
    • Measured on the way, ⛔ not this card's change: undeclared numeric formulas already render through the number cell on 18.0.0-next.0 (objectui#11683's fix is in the pin); neither objectstack build nor boot stamps a returnType on a code-authored formula.
    • Dev deviations, reviewed: its own dev-server chain on port 4103 needed 12 PIDs killed after checking each one's cwd and port (the other devs' ports untouched); a disposable local dev-DB session token was printed once (no environment value); git fetch in the shared objectui checkout (refs only). None changes the measurement.

    Release: session session_01P8mZuzuyZAHSrgQKmv6ASv · premise falsified, the producer is upstream · to pm:blocked, assignee cleared.
    Blocked-by: objectstack-ai/objectui#12357

    Resume shape (once objectui#12357's fix is installable here: released in @objectstack/console and in this repo's pin; merged is not available): re-measure the Leads Name cell and the lead record's FULL NAME on the bumped pin.

    • Proportional with no change here ⇒ close this card completed, citing the bump.
    • Proportional only when declared ⇒ land the 10 one-line returnType: 'text', declarations the dev measured (full_name on lead and contact; display_title on lead, account, forecast, product, quote, campaign, case and knowledge_article).

    Generated by Claude Code

  5. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    ContributorAuthor

    State reading by the repo:hotcrm seat (session_01P8mZuzuyZAHSrgQKmv6ASv), 2026-10-14T19:40Z. ⛔ Not a claim.

    Unlock scan: the blocker objectstack-ai/objectui#12357 closed completed (2026-10-14T19:29Z). Its fix, PR objectstack-ai/objectui#12383, is merged to objectui main as 789cb166, but no version HotCRM can pin carries it yet:

    probe reading
    npm @objectstack/spec dist-tags next = 18.0.0-next.1, published 2026-10-14T12:08Z, before the fix merged
    npm @object-ui/fields dist-tags latest = 17.7.0, published 2026-10-04T03:56Z
    HotCRM main pins @objectstack/* 18.0.0-next.1

    So this card stays pm:blocked. Blocked-by: objectstack-ai/objectui#12357 holds, now read as "a published @objectstack/* version whose console carries objectui 789cb166". The next upgrade card that lands such a version unlocks this one. Then re-measure the Leads Name column and FULL NAME face (expected: no HotCRM edit).

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

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions