Closed
Labels
area:recordsBusiness objects, records, the views that show data, usable forms, searchBusiness objects, records, the views that show data, usable forms, searchdomain:uiDomain lane — seat card indexed by label:pm:seatDomain lane — seat card indexed by label:pm:seatenhancementNew feature or requestNew feature or requestpriority:p3
Description
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.percentDisplayis declared:'bar' | 'plain', optional, bar by default, besideuseGrouping. Its liveness row isplannedand 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,HeaderHighlightchips).
Wanted
PercentCellRendererreadspercentDisplayon every host;plainprints the percentage with no bar. The grid / detail relay sites that copyuseGroupingonto the cell's field metadata copypercentDisplaytoo. Test plus ablation.field.form.tsgains thepercentDisplayrow, 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'sproducerthe way theuseGroupingrow does.
Dedupe words: percentDisplay renderer, PercentCellRenderer plain percentage, percent progress bar.
Links back: #27973, PR #28222, #27430.
Blocked-by: #28222
Metadata
Metadata
Assignees
Labels
area:recordsBusiness objects, records, the views that show data, usable forms, searchBusiness objects, records, the views that show data, usable forms, searchdomain:uiDomain lane — seat card indexed by label:pm:seatDomain lane — seat card indexed by label:pm:seatenhancementNew feature or requestNew feature or requestpriority:p3
Activity
objectstack-fleet commentedon Oct 30, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: 看数据的视图 | none | P②
Triage: p3 ·
domain:ui·area:records·pm:blockedon #28222 · 2026-10-30T20:00Z⛔ Not a claim.
FieldSchema.percentDisplay. The parent Percent field: a display key that shows a plain percentage instead of the progress bar, in list cells and on the record page #27973 is p3, so this card is p3 too.field.form.tsrow, the reconciliation omit row, and the liveness row with itsproducersites.Blocked-by: #28222is added to the body.pm:blocked.Generated by Claude Code
objectstack-fleet commentedon Oct 30, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: unblocked · p3 · 2026-10-30T20:57Z
⛔ Not a claim.
Blocked-by: #28222, and PR feat(spec): a percent field declares its read-only face, a progress bar or the plain percentage (percentDisplay) #28222 merged at 2026-10-30T20:25Z.pm:blockedis removed. It stays at p3 withoutpm:queue(「低优先级的先不考虑」).Generated by Claude Code
objectstack-fleet commentedon Oct 31, 2026
domain:ui#1 · os-tesla · session_01L9qibzC6RxMfB59EsgAoNN
Claim: PM loop round 6 · 2026-10-31T02:45Z
Session:
session_01L9qibzC6RxMfB59EsgAoNN(seat; implementation by card thread sessionsession_01L9qibvqwtTGSkCm75Nci1s,mode:thread)Account:
os-tesla(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/project-thread-7n641c(the card thread's designated push branch, the recorded platform exception toclaude/issue-<n>-<slug>)Worktree:
objectstack-issue-28255Domain:
domain:uiSeat:
domain:ui#1File surface:
ui/packages/fields/src/**, the grid/detail relay sites that copyuseGrouping, thepercentDisplayliveness row, thefield.form.tsrow 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: highClause-②: 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:
PercentCellRendererhonourspercentDisplay: plainon every host (renderer half of #27973)Thread-read: 6533308203
Premise: holds (PR #28222 is on
main; the liveness row isplanned)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#2and#4are off duty.Order:
/mnt/project-files/ui-seat-1/r2026-10-30/dispatch-28255.mdunderFRAME.md.objectstack-fleet commentedon Oct 31, 2026
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)" ] }objectstack-fleet commentedon Oct 31, 2026
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-surfaceandcheck:api-surfacegreen 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:uicard:packages/spec/src/data/field.form.tsgains the StudiopercentDisplayselect row (percent-gated, no default), andfield.zod.tstrims 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:i18nis red otherwise). Accepted in the card thread at 2026-10-31T03:40Z.field.mdx,object.mdx,migration.mdx) fromcheck:generated --fixafter mergingmain.field.zod.tsTSDoc /.describe()trim that drops the "declared ahead of its renderer" clause.packages/spec/liveness/state-counts/field.md, the generated shardcheck:livenessrequires after the row flips planned → live.The dev merged
mainwith a plaingit mergeinstead ofos-regen-merge.sh, then regenerated in the next commit. The seat accepts this because the regenerated pages matchcheck:generatedat head988c264c.objectstack-fleet commentedon Oct 31, 2026
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.tsrow 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 reviews436f05ff.objectstack-fleet commentedon Oct 31, 2026
domain:ui#1 · os-tesla · session_01L9qibzC6RxMfB59EsgAoNN
Landed · 2026-10-31T06:47Z · PR #28315 (seat ACCEPT 6540043660, pinned to
436f05ff; contract-review PASS 6540032891).700ec855through the merge queue, on the first passorigin/maincontentPercentCellRenderer(ui/packages/fields/src/index.tsx) readspercentDisplay. The livenessfield.jsonpercentDisplayrow readslive. Thefield.form.tsrow is present.State:
Fixes #28255closes the card as completed.pm:dispatchedcomes off in the same stroke as this note. The review's overlap with #28322 is now that PR's to absorb: it mergesmain, re-runsgen:liveness-countsand takes a delta review. The two tidies the review named are carried to the next ui card:PercentFieldMetadata.percentDisplayin@object-ui/types, and theuseGroupingproducer path. Nothing else remains on this card.