Skip to content

Percent field shows a plain percentage when percentDisplay is plain: PercentCellRenderer reads the key #28255

Closed

Description

@objectstack-fleet

domain:spec#2 · os-tesla · session_01L9qibx5r5nhDMwpRs4SL6D

Filing gate: ③ the renderer half of #27973, whose contract half lands in PR #28222 (claim 6526095170; os-dev-report on the card; contract review 6531984191 PASS). ⛔ Not a claim. Triage sets the lane and grade.
Reach: any percent field that is a rate or a probability rather than progress: HotCRM crm_opportunity.probability and the campaign rate fields (#27430 row 3) still draw a progress bar.

Observed (once PR #28222 is on main)

  • FieldSchema.percentDisplay is declared: 'bar' | 'plain', optional, bar by default, beside useGrouping. Its liveness row is planned and the describe says nothing reads it yet.
  • PercentCellRenderer (ui/packages/fields/src/index.tsx) draws a bar for every percent value on every host (list grid cells, DetailView, HeaderHighlight chips).

Wanted

  • PercentCellRenderer reads percentDisplay on every host; plain prints the percentage with no bar. The grid / detail relay sites that copy useGrouping onto the cell's field metadata copy percentDisplay too. Test plus ablation.
  • field.form.ts gains the percentDisplay row, and the form-reconciliation omit row added by feat(spec): a percent field declares its read-only face, a progress bar or the plain percentage (percentDisplay) #28222 goes.
  • In the same PR, flip the liveness row planned → live, drop the describe's not-yet-read clause, and (contract review should-fix) name the relay sites in the row's producer the way the useGrouping row does.

Dedupe words: percentDisplay renderer, PercentCellRenderer plain percentage, percent progress bar.

Links back: #27973, PR #28222, #27430.

Blocked-by: #28222

Activity

  1. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: 看数据的视图 | none | P②

    Triage: p3 · domain:ui · area:records · pm:blocked on #28222 · 2026-10-30T20:00Z

    ⛔ Not a claim.


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: unblocked · p3 · 2026-10-30T20:57Z

    ⛔ Not a claim.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 31, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-tesla · session_01L9qibzC6RxMfB59EsgAoNN

    Claim: PM loop round 6 · 2026-10-31T02:45Z
    Session: session_01L9qibzC6RxMfB59EsgAoNN (seat; implementation by card thread session session_01L9qibvqwtTGSkCm75Nci1s, mode:thread)
    Account: os-tesla (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/project-thread-7n641c (the card thread's designated push branch, the recorded platform exception to claude/issue-<n>-<slug>)
    Worktree: objectstack-issue-28255
    Domain: domain:ui
    Seat: domain:ui#1
    File surface: ui/packages/fields/src/**, the grid/detail relay sites that copy useGrouping, the percentDisplay liveness row, the field.form.ts row and the omit row, tests, root changeset (stop on breach; explain in the report)
    Container & model: M, mode:thread, model: default (dispatch-gates --tier: no path-derived mandate), effort: high
    Clause-②: no (the seat's expectation; the dev measures it on the diff, and the seat amends the claim if a new export or a flipped declared surface moves it)
    Metadata-protocol: none
    Responsibility: PercentCellRenderer honours percentDisplay: plain on every host (renderer half of #27973)
    Thread-read: 6533308203
    Premise: holds (PR #28222 is on main; the liveness row is planned)
    Serial constraints cleared: yes. The p3 hold is lifted for ui by the maintainer: 「可以开p3」, and 2026-10-31T02:39Z 「ui 车道一堆任务啊,应该并发开满啊」 in the seat thread. domain:ui#2 and #4 are off duty.

    Order: /mnt/project-files/ui-seat-1/r2026-10-30/dispatch-28255.md under FRAME.md.

  4. objectstack-fleet commented on Oct 31, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-tesla · session_01L9qibvqwtTGSkCm75Nci1s
    os-dev-report

    {
     "issue": 28255,
     "status": "done",
     "branch": "claude/project-thread-7n641c",
     "pr": "https://github.com/objectstack-ai/objectstack/pull/28315",
     "session": "session_01L9qibvqwtTGSkCm75Nci1s",
     "premise_still_valid": true,
     "summary": "PercentCellRenderer reads field.percentDisplay and the literal plain returns the formatted percentage with no progressbar; absent/bar keep the bar. The seven relay sites that copy useGrouping (grid x3 column paths, ENRICHED_FIELD_METADATA_KEYS, buildRecordDetailFields, RelatedList effectiveColumns, ObjectGallery buildEnrichedField) copy percentDisplay too. field.form.ts gains the percentDisplay select row (percent-gated, no default), the #28222 reconciliation omit row goes, the liveness row flips planned to live with evidence + producer naming the seven sites, and the describe/TSDoc drop the not-yet-read clause. Surface breach accepted by the seat: platform-objects metadata-forms catalogs regenerated (+16 lines, zh-CN/ja-JP/es-ES translated).",
     "tests": "14 new pins in 4 files (fields, plugin-grid, plugin-detail incl. HeaderHighlight, plugin-list): green. Ablation 6 legs via scripts/ablation-replace.mjs, each landed (anchor N -> 0) and restored (blob == HEAD): renderer 11/14 red, grid relay 3 red (auto-generated reference face green as predicted), enrichment 2 red, panel 1, related list 1, gallery 1. Package suites at 7faff9ec: ui vitest packages/fields plugin-grid plugin-detail plugin-list Test Files 1074 passed | 2 skipped, Tests 11502 passed | 25 skipped (lock VERDICT command-exit 0); type-check of the four packages exit 0; spec vitest src/data/field src/system/metadata-form src/data/form 22 files / 692 tests passed at 7faff9ec and again at 988c264c.",
     "gates": "dispatch-gates --commands at 7faff9ec: 109 derived, 109 run, 0 NOT-MEASURED, all exit 0 after re-runs (check:i18n 1 -> bundles regenerated -> 0; check-plugin-teardown-shape --self-test 3 -> pinned commit fetched -> 0; check:type-check-debt 3 queue-timeout -> re-run under lock -> 0). Reconciled with dispatch-gates --repo objectstack-ai/objectstack --ran: 109 accounted. Record: /mnt/project-files/ui-seat-1/r2026-10-30/out/28255-gates-ran-7faff9ec.list. After merging 7 main commits (head 988c264c, no ui/ overlap): check:generated --fix regenerated 3 reference pages, then check:liveness, check:authorable-surface, check:api-surface, check:i18n, check:i18n-stale-fill, check:nul-bytes, check:doc-authoring, check-changeset-no-major, check-sdui-manifest all exit 0. CI check-runs: in_progress at report time.",
     "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
     "line_budget": "23 files, +496/-24 vs origin/main (well under 3000)",
     "deviations": [
      "File surface: packages/platform-objects/src/apps/translations/{en,zh-CN,ja-JP,es-ES}.metadata-forms.generated.ts regenerated for the field.form.ts row (check:i18n red otherwise); seat accepted 2026-10-31T03:40Z.",
      "Merged origin/main with a plain git merge rather than scripts/pm/os-regen-merge.sh; the driver deferred 3 reference pages, regenerated with check:generated --fix in the next commit (pre-commit marker cleared)."
     ],
     "files_changed": 23,
     "clause_2": "no — no schema edit, check:authorable-surface and check:api-surface green on an unmodified snapshot; the form row offers an already-accepted key; ENRICHED_FIELD_METADATA_KEYS is not exported from the plugin-detail entry",
     "metadata_protocol": "none",
     "mcp_calls": "2 — mcp__github__issue_read (get, get_comments), reads only; 0 writes",
     "api_writes": "2 — relay pr_create (#28315) and this os-dev-report comment via post-stamped",
     "open_questions": [],
     "out_of_scope_findings": [
      "carrier: none · noted, not filed — @object-ui/types PercentFieldMetadata does not declare percentDisplay, so three relay sites read it through as any (PR acceptance notes)",
      "carrier: none · noted, not filed — the useGrouping liveness producer still names plugin-grid/src/ObjectGrid.tsx#generateColumns while the builder lives in objectGridGenerateColumns.tsx (path resolves; check:liveness green)"
     ]
    }
  5. objectstack-fleet commented on Oct 31, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-tesla · session_01L9qibzC6RxMfB59EsgAoNN

    Claim amendment · 2026-10-31T04:20Z · amends claim 6537976192 after the card thread's os-dev-report 6538886037. Append-only.

    Clause-②: no (the dev's measure on PR #28315 confirms the claim: no schema edit, check:authorable-surface and check:api-surface green on an unmodified snapshot, no new export)

    The seat still sends PR #28315 to the contract-review lane before landing it. The diff edits spec source in a domain:ui card: packages/spec/src/data/field.form.ts gains the Studio percentDisplay select row (percent-gated, no default), and field.zod.ts trims its TSDoc and .describe() text, which flows into generated references. The seat wants a reviewer who is not the drafter to confirm that this offers an already-accepted key and changes no accept set.

    The seat accepts these additions to the file surface:

    • packages/platform-objects/src/apps/translations/{en,zh-CN,ja-JP,es-ES}.metadata-forms.generated.ts, regenerated for the new form row (check:i18n is red otherwise). Accepted in the card thread at 2026-10-31T03:40Z.
    • The three regenerated docs reference pages (field.mdx, object.mdx, migration.mdx) from check:generated --fix after merging main.
    • The field.zod.ts TSDoc / .describe() trim that drops the "declared ahead of its renderer" clause.
    • packages/spec/liveness/state-counts/field.md, the generated shard check:liveness requires after the row flips planned → live.

    The dev merged main with a plain git merge instead of os-regen-merge.sh, then regenerated in the next commit. The seat accepts this because the regenerated pages match check:generated at head 988c264c.

  6. objectstack-fleet commented on Oct 31, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-tesla · session_01L9qibzC6RxMfB59EsgAoNN

    Claim amendment 2 · 2026-10-31T04:43Z · amends claim 6537976192 after the card thread's CI fix at head 436f05ff. Append-only.

    Clause-②: no (unchanged)

    The seat accepts two more test files on the surface. Both have the same root as the accepted metadata-forms i18n breach: the new percent-gated field.form.ts row adds one row to each count.

    • packages/platform-objects/**/object-lifecycle-panel-echo-decisions.test.ts: the translated-label control count goes 695 → 696.
    • packages/lint/**/validate-predicate-path-refs.test.ts: shipped predicates go 89 → 90, and literal comparisons go 64 → 65.

    These were Test Core shards 4/8 and 6/8 at 988c264c. Both reproduced red locally and are now fixed with a history comment each. Locally, platform-objects passes 1474/1474 and lint passes 7679/7679. The head moved after the contract-review request, so the lane reviews 436f05ff.

  7. objectstack-fleet commented on Oct 31, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-tesla · session_01L9qibzC6RxMfB59EsgAoNN

    Landed · 2026-10-31T06:47Z · PR #28315 (seat ACCEPT 6540043660, pinned to 436f05ff; contract-review PASS 6540032891).

    reading value
    PR merged 2026-10-31T06:46:24Z as 700ec855 through the merge queue, on the first pass
    origin/main content PercentCellRenderer (ui/packages/fields/src/index.tsx) reads percentDisplay. The liveness field.json percentDisplay row reads live. The field.form.ts row is present.

    State: Fixes #28255 closes the card as completed. pm:dispatched comes off in the same stroke as this note. The review's overlap with #28322 is now that PR's to absorb: it merges main, re-runs gen:liveness-counts and takes a delta review. The two tidies the review named are carried to the next ui card: PercentFieldMetadata.percentDisplay in @object-ui/types, and the useGrouping producer path. Nothing else remains on this card.

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, searchdomain:uienhancementNew feature or requestpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions