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 }}
Repository navigation
Percent field shows a plain percentage when percentDisplay is plain: PercentCellRenderer reads the key #28255
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.
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.
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.
One-PR cross-domain exception, exactly what the card names: the field.form.ts row, the reconciliation omit row, and the liveness row with its producer sites.
Blocked-by: #28222 is added to the body. pm:blocked.
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.
{
"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)"
]
}
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.
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.
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.jsonpercentDisplay 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.
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.