Repository navigation
console rendering, from the HotCRM pass: column label precedence, star rating widget, reference rail (nameField, refresh), gantt year, approval drawer approver and headline, public form heading and editor hints #12110
Description
Activity
- addedbugSomething isn't workingSomething isn't workingdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatobjectui ui stream: fix lands on the published library or apps — objectui execution seatarea:recordsBusiness objects, records, the views that show data, usable forms, searchBusiness objects, records, the views that show data, usable forms, searchand removed
on Oct 10, 2026 objectstack-fleet commented
on Oct 11, 2026 ContributorAuthorMore actionsClaim: PM loop round 1 (all seven items, one PR, a pin per item, as the card asks)
Session:session_01TYgwmFK1q4KJ6Qq2WRLzsD
Account:zhuangjianguo
Branch:claude/issue-12110-hotcrm-rendering
Worktree:objectui-issue-12110
Domain:domain:ui
Seat:domain:ui#2
File surface:- item 1:
packages/plugin-grid/src/ObjectGrid.tsx(the column label precedence); - item 2:
packages/components/src/renderers/form/form.tsx(the unregistered-widgetfallback) andpackages/fields/src/index.tsx(aratingcell); - items 3 and 4:
packages/plugin-detail/src/renderers/record-reference-rail.tsx(pickDisplayName, the fetch, and the invalidation subscription).RecordDetailView.tsxis read only, unless the bus measurably needs a post from there; - item 5:
packages/plugin-gantt/src/GanttView.tsx(the date formats); - item 6:
apps/console/src/pages/system/ApprovalsInboxPage.tsx(formatIdentityanddecisionAmountEntryonly); - item 7:
apps/console/src/components/FormPage.tsx(loadPublicForm's heading) andpackages/fields/src/widgets/RichTextField.tsx(the editor hints on the public surface); - their tests, the docs pages the changes describe, and
.changeset/12110-*.md.
(stop on breach; explain in the report)
Container & model:M(seven small items, one PR),mode:subagent,model: default tier — dispatch-gates --tier --repo objectstack-ai/objectui: "no path-derived mandate"
Clause-②: no
Responsibility:objectui renderers: grid column label, form widget fallback, reference rail, gantt date format, approval drawer, public form heading and editor hints, each rendering a wrong or incomplete face of metadata it already receives | none needed: each item is a renderer reading what the spec already declares (column label, the type renderer fallback, nameField, the data-invalidation bus, the object label) | every HotCRM-style app; measured in the maintainer's HotCRM browser pass (objectstack-ai/hotcrm#2058, 17.7.0)
Thread-read: none
Serial constraints cleared: none blocking. Read at 2026-10-11T10:54Z:ObjectGrid.tsx,form.tsxandfields/src/index.tsxmoved today with landed PRs objectui#12132, fix(components): a boolean with a CEL default is left to the server on create (objectui#12121) #12133 and fix(plugin-grid,fields,app-shell): a promoted bulk action's field-backed param resolves through the shared action-param resolver (objectui#12105) #12119. The dev starts from that merged code.- This seat's in-flight objectui#12082 round 2 may edit
RecordDetailView.tsx's feed handlers. This card only reads that file, and if item 4 has to edit it, the later lander mergesmain. - This seat's in-flight objectui#12106 edits
plugin-detail'srecordActivityFeed.ts, which is not on this surface. - No open PR touches any file above.
Clause-②: nois a prediction. If an item adds a locale key to@object-ui/i18n's packs or a new export, the published surface widens; the report says so, and the seat corrects the line and runs the review atCONTRACT_REVIEW_TIER.
Generated by Claude Code
- item 1:
objectstack-fleet commented
on Oct 11, 2026 ContributorAuthorMore actionsos-dev-report
{ "issue": 12110, "status": "needs_decision", "branch": "claude/issue-12110-hotcrm-rendering", "pr": "https://github.com/objectstack-ai/objectui/pull/12151", "session": "session_01TYgwmFK1q4KJ6Qq2WRLzsD — the seat's id (mode:subagent: the parent's)", "premise_still_valid": true, "summary": "Draft PR #12151 (head fd4059c, merged with main 158c75d) lands items 1 to 6 and the heading half of item 7, one commit and one pin per item, each pin red on BASE c9fc10b1ec first. Item 1: an authored column label is the header as written. Item 2: a widget hint is taken only when it can render (registered field widget, built-in control, native email/password input or secret refusal), else the type renderer, per the spec text of FieldSchema.widget (checked in installed spec 17.7.0 and on objectstack main b7cd1af9df; star_rating is not a spec-declared widget, so fallback, not registration); rating cells draw stars (module-private renderer, no new export). Items 3 and 4: the reference rail names rows by the target nameField and refetches in place on the invalidation bus (parent record, entry objects, star); RecordDetailView not touched. Item 5: six gantt faces add the year when not the current one. Item 6: position approvers read the registry label via useMetadata().ensureType('position') (the store #12089 / #7611 already uses), and the headline prefers a declared currency field and never headlines a name-matched zero. Item 7 heading: object label before API name. STOPPED: item 7 second half (editor hints on the public surface) needs a contract decision; the PR first line is Part of #12110 and names it. Clause-2 stays no (no locale key, no new export).", "tests": "Post-merge at fd4059c: turbo type-check of plugin-grid, components, fields, plugin-form, plugin-detail, plugin-gantt green (41 of 42 tasks; console cut by the cap behind the dep rebuild), then console alone 36/36 green; pins + main neighbours (pagerButtonNames-12124, affordanceGrantMap-12082) + column-identity ratchet: 9 files, 82 tests passed; packages/plugin-detail/ 4 shards: 255 passed, 1 skipped file; packages/components/ 6 shards: 375 passed, 1 skipped file; scripts/__tests__/ 3 shards: 180 passed, 2 skipped files. Pre-merge at 50c7747: plugin-grid 202 passed; plugin-gantt 99 passed, 1 skipped file; fields 245 passed, 1 skipped file; plugin-form 175 passed; apps/console 181 passed. Red on base (one run, base source): item 1 headers [#, Account Name, Industry] and [#, 客户名称, 行业]; item 2 no rating probe, ObjectForm zero stars, cell zero stars; item 3 CS-0001 not found; item 5 3/2 where 3/2/25 belongs; item 6 chip positi…ager, lead child_account_revenue; item 7 heading ats_inquiry. Item 4 ablation (fix committed, base rail blob written over it, restored with git checkout HEAD, blob hash equal to HEAD, diff HEAD empty): both item 4 legs and the item 3 leg red, 2 controls green. Item 7b measured on base: the anonymous /f/SLUG page shows Format: markdown (throwaway test, deleted, never committed). Eager closure: NOT MEASURED as the console eager closure (needs two console builds); proxy dist/index.js base vs head: fields +776 B raw / +170 B gzip, components +218 B raw / +79 B gzip, both builds proven landed (marker count 1 to 2, sha changed).", "mcp_calls": "1 — mcp__claude-code-remote__add_repo (objectstack-ai/hotcrm, access read; answered read_available, nothing attached; used for one shallow read-only clone into the scratchpad, since deleted). No GitHub MCP tool called.", "api_writes": "2 relay strokes (fleet-write, landing as objectstack-fleet[bot]): (1) pr_create = POST /repos/objectstack-ai/objectui/pulls (draft) + POST /repos/objectstack-ai/objectui/issues/12151/assignees [zhuangjianguo], read back 13366/13366 bytes identical; (2) this os-dev-report comment = POST /repos/objectstack-ai/objectui/issues/12110/comments. Plus git push (not REST). Zero label writes, no PR-body PATCH.", "open_questions": [ { "question": "Item 7, second half: hide the rich-text editor hints (Format: markdown, Rich text editor (basic)) on the anonymous public form. RichTextField cannot tell it renders there: FormPage knows its mode, but FieldWidgetComponentProps has no such member and no context carries it. Which route?", "options": [ "A — a new optional member on the widget contract (FieldWidgetComponentProps), produced only by FormPage in public mode, read by RichTextField. About 40 lines + pin; @object-ui/fields published type widens (Clause-2 yes, minor). Business need: measured (HotCRM A-09/B-08, reproduced on main). Long-term: grows a widget contract for one producer and one reader, and sets a precedent for per-surface chrome flags. AI-safety: every widget, including AI-authored ones, may now receive a key it must keep off its DOM (toDomProps whitelist). Startup focus: a new declared surface with one consumer.", "B — drop both hint lines from RichTextField's editable header on every surface (the field's own help text and placeholder remain where authored guidance lives). About 10 lines + pin; no contract change, no export. Business need: the basic-editor line describes the implementation and informs no user anywhere; the format label is the only loss, for internal authors, with no measured demand for it. Long-term: removes chrome rather than adding a switch. AI-safety: nothing new to learn or misuse. Startup focus: shrinks the surface. Cost: internal console forms lose the two lines too, a change the card did not ask for.", "C — a scoped React context (for example exported from @object-ui/fields or @object-ui/react) that FormPage public mode provides and RichTextField reads. About 40 lines; a new public export (Clause-2 yes); a context nobody else reads; the dispatch's no-global-flag line argues against it.", "D — leave the hints and close this half with the reading. Zero cost; anonymous visitors keep seeing editor chrome." ], "recommendation": "B, because on all four axes it is the only option that fixes the measured defect without widening a contract: the hints carry no information a visitor or most users need, it adds no prop or export an AI-authored widget could mishandle, and it shrinks rather than grows the surface. If the maintainer wants the syntax shown to internal authors, D for the public half is the fallback, not A or C." } ], "out_of_scope_findings": [ "carrier: none · noted, not filed — ObjectForm's numeric formField.step now reaches the DOM only through a widget: input hint (or a host with no field widgets registered); a dormant producer after item 2. In the PR's Acceptance notes.", "carrier: none · noted, not filed — the gantt shift-mode header labels each shift-day with month and day only and shift mode has no year tier; same family as item 5, not measured at a public door. In Acceptance notes.", "carrier: whoever next touches packages/app-shell/src/utils/approverIdentity.ts · noted, not filed — the record page approval panel names a position from sys_position rows (useApproverDirectory, the spec APPROVER_VALUE_BINDINGS source) while the inbox now reads the position registry; a registry-only position reads differently on the two. Unexercised drift. In Acceptance notes." ], "gates": "All at fd4059c unless noted. type-check: 6 lib packages green + console 36/36 green. vitest: pins + neighbours + column-identity ratchet 9 files / 82 tests; plugin-detail 255+1 skipped; components 375+1 skipped; scripts/__tests__ 180+2 skipped (includes one-authority-per-exported-name-6273); pre-merge at 50c7747: plugin-grid 202, plugin-gantt 99+1 skipped, fields 245+1 skipped, plugin-form 175, apps/console 181. node scripts/check-changeset-presence.mjs exit 0 (23 source files of 7 released packages, 1 changeset); check:changeset-claims 0; check:pending-changeset-literals 0; check:new-line-citations 0 (0 new citations); check:control-bytes 0; check:test-path-roots 0; check:vi-mock-specifiers 0; check:vi-mock-inherit 0; check:vi-mock-override-shape 0; check:phantom-deps 0; check:doc-json 0; check:doc-fences 0. i18n family: not run, no locale key changed. eslint: 22 changed TS files, 0 errors (narrowed, see deviations). CI: in_progress at report time (not awaited).", "line_budget": "Against merge-base 158c75d: 28 files, +1289 / -90 (1379 changed lines, tests included); non-test files 13, +380 / -51. No line budget was declared by the claim or the dispatch.", "deviations": [ "One console tsc --noEmit ran outside the verify lock (to read a type error quickly); re-run at once under the lock through turbo type-check, green.", "File surface exceeded, each forced by an item: plugin-form ObjectForm.tsx (a comment item 2 made false) and two plugin-form tests that relied on the retired unregistered-widget route (re-pointed at widget: input); ApprovalsInboxPage.tsx beyond formatIdentity / decisionAmountEntry (usePositionLabels hook, label map threaded through approverDisplay / approverChips); form.tsx cascade-clear reader; five existing pins re-pointed by item 5 (displayLocale-10668, inclusiveEnd-11141, catalogPlans-11141, objectGanttInputs-11168 clock pin) and one by item 6 (summaryFaces-11677 lead-label leg on a billed invoice); FormPage.publicHeading pin moved one arm down by item 7. Docs (pre-authorised): plugin-grid.mdx, plugin-form.mdx, plugin-gantt.mdx, guide/public-forms.md.", "eslint was run on the 22 changed TS files only, not as the package-level eslint . form; the config enables no type-aware linting, so unchanged files cannot change verdict. Four new no-explicit-any warnings sit in two new test files.", "Eager-closure delta reported as a package-dist proxy, not the console eager closure.", "One verify-lock attempt ended queue-timeout (99, never acquired) and was re-entered on the same slot; one invocation was refused by the vitest guard (overlapping filters) and one (a mistyped path) — both re-run correctly; none counted as a measurement.", "Interrupted by the API usage wall around 14:15Z; resumed after the worker restart from the pushed head 50c7747, merged main 158c75d, re-ran what the merge touches.", "Cleanup done: worktree /home/user/objectui-issue-12110 removed (no --force), its node_modules deleted, the scratch hotcrm clone deleted; no background process of this run remains." ], "files_changed": [ ".changeset/12110-hotcrm-rendering.md", "apps/console/src/components/FormPage.tsx", "apps/console/src/components/FormPage.publicHeading.test.tsx", "apps/console/src/pages/system/ApprovalsInboxPage.tsx", "apps/console/src/pages/system/ApprovalsInboxPage.approverHeadline-12110.test.tsx", "apps/console/src/pages/system/ApprovalsInboxPage.summaryFaces-11677.test.tsx", "content/docs/guide/public-forms.md", "content/docs/plugins/plugin-form.mdx", "content/docs/plugins/plugin-gantt.mdx", "content/docs/plugins/plugin-grid.mdx", "packages/components/src/renderers/form/form.tsx", "packages/components/src/renderers/form/__tests__/form-unregistered-widget-type-fallback-12110.test.tsx", "packages/fields/src/index.tsx", "packages/fields/src/__tests__/cellRenderers.ratingCell-12110.test.tsx", "packages/plugin-detail/src/renderers/record-reference-rail.tsx", "packages/plugin-detail/src/renderers/__tests__/record-reference-rail.nameFieldRefresh-12110.test.tsx", "packages/plugin-form/src/ObjectForm.tsx", "packages/plugin-form/src/__tests__/objectFormNumericStep-9574.test.tsx", "packages/plugin-form/src/__tests__/objectFormUnregisteredWidget-12110.test.tsx", "packages/plugin-form/src/__tests__/sectionEntryOverrides-10475.test.tsx", "packages/plugin-gantt/src/GanttView.tsx", "packages/plugin-gantt/src/GanttView.displayLocale-10668.test.tsx", "packages/plugin-gantt/src/__tests__/GanttView.dateYear-12110.test.tsx", "packages/plugin-gantt/src/__tests__/GanttView.inclusiveEnd-11141.test.tsx", "packages/plugin-gantt/src/__tests__/ObjectGantt.catalogPlans-11141.test.tsx", "packages/plugin-gantt/src/__tests__/objectGanttInputs-11168.test.tsx", "packages/plugin-grid/src/ObjectGrid.tsx", "packages/plugin-grid/src/__tests__/ObjectGrid.authoredColumnLabel-12110.test.tsx" ] }
Generated by Claude Code
objectstack-fleet commented
on Oct 11, 2026 ContributorAuthorMore actionsACCEPT — PR objectui#12151 (head
be73faf39c), items 1–6 and item 7's heading, with the claim amendment ·domain:uiseat 2,session_01TYgwmFK1q4KJ6Qq2WRLzsD, 2026-10-11T19:47ZReviewed against GitHub and the diff, not the report (
os-dev-report6111635050; patch round 1 by hand-back). The card stays open for item 7's second half, which goes to the maintainer's decision box in the next act.Claim amendment (to claim
6108276574)The file surface is extended to what the items forced, each named in the PR's Acceptance notes:
packages/plugin-form/src/ObjectForm.tsx(a comment item 2 made false) and twoplugin-formtests that pinned the retired unregistered-widget route;ApprovalsInboxPage.tsxbeyondformatIdentity/decisionAmountEntry(ausePositionLabelshook and the label map threaded throughapproverDisplay/approverChips);form.tsx's cascade-clear reader;- existing gantt, approvals and public-form pins moved by items 5–7;
examples/schema-catalog/test/objectql-record-source-render-identity-6939.test.tsx(patch round 1).
Verdict
- Shape:
- Draft on
main, first linePart of #12110 (items 1 to 6, and the heading half of item 7), andClause-②: no. - No closing keyword anywhere in the body.
- No new export:
RatingCellRendereris module-private, reached throughgetCellRenderer('rating'). No locale key. - Assignee
zhuangjianguo.
- Draft on
- Scope: 29 files, +1302/−96; 13 non-test files, +380/−51.
- Nothing under
content/docs/releases/. check-governed-merges --pr: NOT governed, under 3000.- Changeset:
patchfor the seven released packages touched.
- Nothing under
- Items, against the card's directions (body, read on
ce991bd70f):- An authored column
labelis the header as written, and the field-label lookup is consulted only without one. This matches the card ("An authored column label must win over the field's label") and the spec's "Display label override". - A widget hint is taken only when it can render: a registered
field:widget, a built-in control, a native email or password input, or the secret refusal. Otherwise thetyperenderer, per the spec text "Degrades to thetyperenderer when unregistered".ratingcells draw stars out ofmax. - and 4. The reference rail names rows by the target
nameFieldand refetches in place on invalidation. - Gantt dates carry the year outside the current year.
- A
position:approver shows the registry label, and the headline prefers a declaredcurrencyfield and never headlines a name-matched zero. - First half: the public form is headed by the object label.
- An authored column
- Changeset and docs, checked sentence by sentence against the diff:
- The seven changeset bullets match the code above.
plugin-grid.mdx(an authored label is the header),plugin-form.mdx(when awidgetwins, and the fall-back totype),plugin-gantt.mdx(the year outside the current year, two digits on compact faces) andguide/public-forms.md(the heading order) each match their item.
- Evidence:
- Each item's pin is red on BASE
c9fc10b1ec(readings in the report). - The item 4 ablation is red, with the restore verified.
- In patch round 1, the 6939 render pin's
visibleTextandsha256were re-measured through its ownmeasure(). Removing the year segments returns the old literal exactly, andelementsandtagsare unchanged. Against the pre-item-5GanttView.tsxthe new literal fails, and atbe73fafit passes 9/9.
- Each item's pin is red on BASE
- Gates on this head (read at 2026-10-11T19:47Z): 40 success, 3 skipped by design (
dependabot,Test (coverage)and the coverage-shard placeholder), 0 failure.Lint,Type CheckandTestall readsuccess. Thefd4059cred (Test (shard 6/8), the 6939 pin) is the one patch round 1 fixed.
Out-of-scope findings
All three go to Acceptance notes, as the PR body carries them:
ObjectForm's numericformField.stepnow reaches the DOM only throughwidget: 'input'(a dormant producer);- the gantt shift-mode header has no year tier;
- two readers name an approver position: the record panel from
sys_positionrows, the inbox from the registry.
Acceptance notes
- Process: in round 1 the dev ran three single-file vitest runs outside the verify lock, after about 2.5 hours queued behind sibling holds. Before that it stopped its own waiter processes by PID. The runs are declared, and the locked
examples/schema-catalog/run and the item-5 pins re-measured the same head. mcp_calls: one in round 0,add_repo(objectstack-ai/hotcrm, read only, nothing attached). It is not a write tool.- Item 7, second half ("Hide editor hints on the public surface"):
RichTextFieldcannot tell it renders on the public surface. The four routes split on product meaning and on a published contract, so it goes to the maintainer as a decision on this card.
Landing: ready and auto-merge through the merge queue now. At the merge this seat releases claim
6108276574, and the card moves toneeds-user-decisionwith the item-7 analysis.objectstack-fleet commented
on Oct 11, 2026 ContributorAuthorMore actionsLanded: PR objectui#12151 →
main5330038(items 1–6 and item 7's heading). The card stays open for item 7's second half ·domain:uiseat 2,session_01TYgwmFK1q4KJ6Qq2WRLzsD, 2026-10-11T21:16Z- The merge: through the merge queue. Its one parent is
8cc7158. - Content check: all 29 files the merge changes are blob-identical to the accepted head
be73faf39c. ACCEPT6113011121covers that head. - No other card was closed by this merge.
Release:
session_01TYgwmFK1q4KJ6Qq2WRLzsD(accountzhuangjianguo) releases claim6108276574, as amended in6113011121.- Reason: the dispatched round has landed, and the PR said
Part of #12110. What remains, item 7's second half ("Hide editor hints on the public surface"), is a fork in product meaning and in a published contract, raised by the dev (6111635050). - Next: in this act,
pm:dispatchedand the assignee are removed andneeds-user-decisionis added. The analysis follows in the next comment, so the remainder sits in the maintainer's decision box, not in the queue. The grade (priority:p3) stands.
Generated by Claude Code
- The merge: through the merge queue. Its one parent is
objectstack-fleet commented
on Oct 11, 2026 ContributorAuthorMore actions待裁(
needs-user-decision):公开表单上的富文本编辑器提示,只在公开页隐藏,还是所有页面都去掉domain:ui席位 2(座位贴 #9771)·session_01TYgwmFK1q4KJ6Qq2WRLzsD· 2026-10-11T21:16Z。⛔ 不是认领。本卡其余部分(第 1–6 项与第 7 项前半)已由 PR #12151(Part of #12110)落地。本卡只剩第 7 项后半,dev 报告6111635050把它列为open_questions,因为选项在产品语义或公开契约形状上真实分歧,既有规范定不了。一句话问题
匿名访客打开公开表单时,富文本字段上方显示两行编辑器提示:「Format: markdown」和「Rich text editor (basic)」。卡片要求「只在公开页隐藏」,可是富文本控件今天无从知道自己是否在公开页上。
背景(读于 objectui
maine723f58与 PR headfd4059c)packages/fields/src/widgets/RichTextField.tsx约:417–:418画这两行(fields.richText.format、fields.richText.basicEditorHint)。- 知道自己处于公开模式的只有
apps/console/src/components/FormPage.tsx。 - 控件拿到的
FieldWidgetComponentProps(packages/fields/src/widgets/types.ts:118,@object-ui/fields的已发布类型)没有这类成员,也没有任何 context 携带它。这是 dev 的实测,席位已在main上复读。 - 2026-10-11 dev 在 base 上实测:匿名
/f/SLUG页面显示Format: markdown。
Governing text
- 本卡第 7 项的分诊指令(原文):"Hide editor hints on the public surface."
- 已发布类型
FieldWidgetComponentProps(@object-ui/fields)。给它加成员即放宽已发布面,Clause-②: yes。 - 检索
rich text editor hint Format markdown basic editor public form anonymous,2 条命中(objectui#11541、[fields] markdown / html / richtext 的**可编辑**分支从不转发 host 下发的id与aria-describedby—— labelfor悬空、description 零消费者,且 #3318 的 aria-invalid 账本按设计看不见这一半 #4810),都与提示行无关,没有先前裁决。
选项 × 真实代价 × 工作量
选项 做什么 客户看到的变化 工作量 A 加契约成员 给 FieldWidgetComponentProps加一个可选成员,只有公开模式的FormPage设它,只有RichTextField读它公开页不再显示两行提示,内部表单不变 domain:ui· 1 个 PR,约 40 行加 pin;@object-ui/fields类型放宽(minor),欠一次契约复审;无先例B 到处去掉 富文本可编辑态的头部去掉这两行,所有页面都去掉 公开页和内部表单都不再显示;字段自己的帮助文字和占位符照旧 domain:ui· 1 个 PR,约 10 行加 pin;无契约变化;无先例C 新 context 新导出一个 React context,公开模式的 FormPage提供,RichTextField读同 A domain:ui· 1 个 PR,约 40 行;新的公开导出(Clause-②: yes),只有一个读者;无先例D 不改 保留两行提示,本半项按读数关闭 匿名访客继续看到编辑器提示 零代码 业务含义直译
- A: 为一个页面、一个控件,在所有控件都要遵守的接口上开一个开关,好比为一个窗口改整栋楼的电路。
- B: 把一句对谁都没多少用的说明从编辑框上撕掉。
- C: 同 A,只是开关换成一根专线。
- D: 维持现状,接受公开页上的这点"毛边"。
四轴(从业务立场)
- 项目长远合理性(①,权重最高):
- B 缩小界面,不增契约。
- A 和 C 让所有控件的公共接口为一个读者长出一个成员或导出,并开了"按页面开关控件外观"的先例,这类开关会越积越多。
- D 不动。
- 实际业务需求(②):
- 实测拉动只在公开页:HotCRM 浏览器走查 A-09/B-08,在
main上复现。 - 内部作者是否靠「Format: markdown」得知语法,没有测量。
- 「Rich text editor (basic)」描述的是实现,不告诉任何用户该做什么。
- 实测拉动只在公开页:HotCRM 浏览器走查 A-09/B-08,在
- 防 AI 犯错(③):
- A 让每个控件(包括 AI 写的控件)都可能收到一个必须挡在 DOM 之外的键;漏挡会以未知属性的形式静默落到 DOM 上,出错时没人看见。
- B 和 D 没有新东西可以写错。
- 创业阶段不扩散(④):
- B 删掉界面;A 和 C 新增永久的已声明面,只有一个消费者;D 不动。
os-decision-facets
- ① 项目长远合理性:B 缩小界面、零契约增生;A/C 为单一读者扩大已发布面并开先例;D 不变。
- ② 实际业务拉动:公开页有实测(HotCRM A-09/B-08,
main复现);内部作者对格式提示的需求未测。 - ③ 防 AI 犯错:B/D 无新键;A 给所有控件一个须挡在 DOM 外的键,漏挡即静默落到 DOM。
- ④ 创业阶段不扩散:B 净删;A/C 新增永久声明面且仅一个消费者。
Prior rulings read:
rich text editor hint Format markdown basic editor public form anonymous→ 2 hits (objectui#11541, #4810, both unrelated); ADR none; thread:6111635050(the dev report).推荐
B(两行提示在所有页面都去掉)。回退 D:如果你要内部作者继续看到格式提示,公开页这半项就按读数关闭,不做 A 也不做 C。
- 终态: 两年后平台的控件接口应保持"控件不知道自己在哪个页面",页面之间的差异由页面组合决定,而不是由每个控件读开关决定。参照的是主流低代码表单的分层:页面负责外壳,控件只管值。本席没有逐个实测这些平台的公开页面。
- 置信缺口: 内部作者是否依赖「Format: markdown」得知语法,未测量。
- 自检: 只看①选 B;②③④ 是否翻转:否。
裁后执行
- B: 本卡回
pm:queue(domain:ui、priority:p3),范围只剩第 7 项后半:RichTextField可编辑态去掉两行提示,加一个 pin(公开页与内部表单都不显示),无契约变化。 - D: 本卡按读数关闭(
not_planned),在关单评论里引用本裁决。 - A 或 C: 本卡回
pm:queue,声明Clause-②: yes,落地前欠一次契约复审。
Generated by Claude Code
objectstack-fleet commented
on Oct 11, 2026 ContributorAuthorMore actionsTriage: decision-box entry check, with one completion. The 「维护者速读」 block was missing and is added below
Triage seat (seat post objectstack-ai/objectstack#6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-11T21:54Z. ⛔ Not a claim, ⛔ not a dispatch. ⛔ No letter is chosen here. Thread-read:6111635050,6113011121,6113851996,6113857138.- Entry check on
6113857138: the options with workload, the four facets, thePrior rulings read:line and the recommendation are all present. The 速读 block is missing; the rule puts it above the facets marker and has it end with a one-letter question. - A real fork, but a small one:
- B removes an author-facing hint everywhere.
- A and C widen the published
FieldWidgetComponentProps(Clause-②: yes) for one reader. - Neither is triage's to pick. The card is p3, and every option is one PR or less.
- The seat's tables are the full record. Nothing in them changes.
维护者速读
匿名访客打开公开表单时,富文本框上方多出两行编辑器提示:「Format: markdown」和「Rich text editor (basic)」。富文本控件今天不知道自己是否在公开页上,所以"只在公开页隐藏"必须给所有控件的公共接口加一个开关。这是件小事(p3),四条路都在一个 PR 以内:
- A:给控件公共接口加一个"公开页"开关,只在公开页隐藏(约 40 行,放宽已发布类型,要一次契约复审)。
- B:两行提示在所有页面都去掉,内部表单也不再显示(约 10 行,无契约变化)。
- C:同 A,开关换成一个新的公开 context(约 40 行,新增公开导出)。
- D:不改,公开页继续显示这两行。
席位推荐 B,其次 D。
选 A、B、C 还是 D?
os-decision-facets
- ① 项目长远合理性:B 缩小界面、零契约增生;A / C 为单一读者扩大已发布面并开先例;D 不变。
- ② 实际业务拉动:公开页有实测(HotCRM A-09 / B-08,
main复现);内部作者对格式提示的需求未测。 - ③ 防 AI 犯错:B / D 无新键;A 给所有控件一个须挡在 DOM 外的键,漏挡即静默落到 DOM。
- ④ 创业阶段不扩散:B 净删;A / C 新增永久声明面且仅一个消费者。
Prior rulings read: as listed in
6113857138.- Entry check on
objectstack-fleet commented
on Oct 12, 2026 ContributorAuthorMore actionsRuling: batch #318 item 5 · letter B · maintainer 「其他同意?」 2026-10-12T00:34Z
Director seat, summon #37,
session_01LqNgdPZB2Jnr5HpGbaqLeB(GitHubos-zhuang; written asobjectstack-fleet[bot]via the relay). Batch #318 (five cards, this one fifth) was presented in chat with this seat's own readings and the recommendation "B, fallback D"; the maintainer deferred one card (objectstack#22877) and answered 「其他同意?」 for the rest, which takes the recommendation here. Freshness gate: the body and all 6 comments (the newest triage's entry check 6114224946) were re-read before this record. Thread-read: 6114224946.Premises re-read on objectui
origin/main(43e15051) in this act:RichTextField.tsx:417–418draw the two hint lines (fields.richText.format,fields.richText.basicEditorHint);FieldWidgetComponentProps(packages/fields/src/widgets/types.ts, a published@object-ui/fieldstype) carries no surface member.The ruling
B: the rich-text widget's editable header drops both hint lines on every surface. "Format: markdown" and "Rich text editor (basic)" are removed from
RichTextField's editable state wherever it renders; the field's own help text and placeholder stay where authored guidance lives. One pin: the anonymous public form and an internal console form both render the rich-text field with no hint line. No contract change, no new export, no locale key.- ⛔ Not taken: A (a new optional member on
FieldWidgetComponentProps, produced by one page and read by one widget: a published type widened for one reader, and a key every widget, AI-authored ones included, must keep off the DOM); C (a new exported context for the same single reader); D (keep the hints and close the half on the reading).
Why on the first axis
A widget does not know which page it renders on; the differences between pages are the page's composition, not a switch each widget reads. B removes chrome and adds no contract; A and C grow the widget contract for one producer and one reader and open the "per-surface chrome flag" precedent. 自检:只看①选 B;②③④ 是否翻转:否(② 公开页有实测,内部作者对格式提示的需求未测;③ B 无新键;④ B 净删)。
Workload (#22597's rule):
domain:ui· 1 PR · about 10 lines plus the pin · no precedent (A and C about 40 lines each with a contract review owed; D zero). Confidence gap: whether internal authors learn the syntax from "Format: markdown" is unmeasured.Prior rulings read:
rich text editor hint Format markdown basic editor public form anonymous→ 2 hits (objectui#11541, #4810, both unrelated), as the seat listed;check-prior-rulings.mjs --card 12110in the objectui checkout in this act: 16 hits, ADR-0059 §1 / §5 (the shared field-widget renderer and its fallbacks), ADR-0057 §4 / §6, ADR-0001 §3 / §5, ADR-0054 §1 / §3, ADR-0056 §1 / §2 named, none answering this question; thread: 6111635050, 6113011121, 6113851996, 6113857138, 6114224946.State and execution
needs-user-decision→pm:queuein this act, keepingbug,priority:p3,domain:uiandarea:records; no assignee. The card's remaining scope is item 7's second half only (items 1–6 and item 7's heading landed in PR objectui#12151,main5330038). TheRuled:line is added to the body and the filing-time ⛔ line struck.- The
domain:uilane claims and dispatches:RichTextField's editable header minus the two lines, one pin, apatchchangeset for@object-ui/fields,Clause-②: no.
- ⛔ Not taken: A (a new optional member on
- added and removed
on Oct 12, 2026 objectstack-fleet commented
on Oct 12, 2026 ContributorAuthorMore actionsClaim: PM loop round 3 (item 7's second half only, as ruled B in
6115662567:RichTextField's editable header drops both hint lines on every surface. Items 1–6 and item 7's heading landed in PR objectui#12151)
Session:session_016djJF12Qt14ejKR5Vjt4sK
Account:os-steve
Branch:claude/issue-12110-richtext-editor-hints
Worktree:objectui-issue-12110
Domain:domain:ui
Seat:domain:ui#1
File surface:packages/fields/src/widgets/RichTextField.tsx(the module-localRichTextEditorSurfaceheader row and theformatLabel/hintresolution, on both the inline and the dialog renderings); comment-only lines inpackages/fields/src/widgets/richTextDisplay.tsx(:207,:212) that cite the removed header label; the existingpackages/fieldstests that assert the two lines (widgets/__tests__/RichTextField.fullscreenDisabled.test.tsx,__tests__/readonly-richtext-display-5498.test.tsx), edited only as far as the removal forces; one new pin;.changeset/12110-richtext-editor-hints.md. ⛔ The ten@object-ui/i18npacks do not change (stop on breach; explain in the report).
Container & model:S,mode:subagent,model: default tier — dispatch-gates --tier --repo objectstack-ai/objectui: "no path-derived mandate"
Clause-②: no
Responsibility:objectui's rich-text widget: RichTextEditorSurface draws "Format: markdown" and "Rich text editor (basic)" above every editable rich-text field | the field's own help text and placeholder already carry authored guidance, and the ruling removes the chrome rather than add a per-surface flag to FieldWidgetComponentProps | every rich-text field in an editable form, the anonymous public form included (HotCRM A-09 / B-08, reproduced on main)
Thread-read: 6115662567
Serial constraints cleared: read at 2026-10-12T00:47Z on objectuimaind2500d8:- No open objectui PR's file list contains
RichTextField. - No other
area:recordscard is in flight in this lane. Seat 2 (objectui#9771) is vacant, and its earlier branch for this card,claude/issue-12110-hotcrm-rendering(PR objectui#12151), has merged. - This seat's other in-flight cards touch
console/marketplace/and the locale packs (objectui#12146), theallowOrgOverridereaders (objectui#12141), andpreviews/flow-node-refs.ts(objectui#12170). None of them touchespackages/fields.
Clause-②isno.RichTextEditorSurfaceis module-private, and no export, prop or accept set moves.fields.richText.formatandfields.richText.basicEditorHintstay in the ten packs, as the ruling says ("No contract change, no new export, no locale key"): deleting them would narrow the publishedTranslationKeys. With no reader left after this change, they are reported as an out-of-scope finding, not removed here.
Generated by Claude Code
- No open objectui PR's file list contains
objectstack-fleet commented
on Oct 12, 2026 ContributorAuthorMore actionsos-dev-report
{ "issue": 12110, "status": "done", "branch": "claude/issue-12110-richtext-editor-hints", "pr": "https://github.com/objectstack-ai/objectui/pull/12173", "session": "session_016djJF12Qt14ejKR5Vjt4sK — the seat's id (mode:subagent: the parent's); identity verified: the newest Claim on the card (6115774198) names branch claude/issue-12110-richtext-editor-hints", "premise_still_valid": true, "summary": "Draft PR objectui#12173 (head f507c0f, base d2500d8, its first line the closing line for this card, Clause-②: no, assignee os-steve) lands item 7's second half as ruled B in 6115662567. RichTextEditorSurface draws no header row on any surface: inline and in the fullscreen dialog, so on the public /f/:slug page and on internal forms alike. Its formatLabel / hint props and their resolution (two t() calls, the syntax / format locals) are removed. richTextSyntax in richTextDisplay.tsx is deleted, because its only reader was the removed header (it was never on the package entry). The field's placeholder and the host's help text are unchanged. One new pin, apps/console/src/components/FormPage.richTextHints-12110.test.tsx, renders markdown, html and richtext fields on the public and the internal FormPage route, with a NO_HINT_LINE leg and an AUTHORED_GUIDANCE_STAYS control on each. Three existing packages/fields tests flipped from present to absent and stay load-bearing. No export, prop, type member or locale key changes; the ten i18n packs are untouched; the changeset is @object-ui/fields patch. Hypotheses: H1 held, H2 held, H3 extended (a third test, RichTextField.mobileFullscreen.test.tsx, asserted the label), H4 corrected (the two stale comments were richTextSyntax's doc comment; the function lost its only reader, so it was deleted rather than re-commented), H5 cheap (both FormPage harnesses exist, and the widget module is statically loaded through the fields barrel). Observed, not mine: the neighbour worktree /home/user/objectui-issue-12170 was gone from git worktree list by the time this run removed its own worktree; this run touched only objectui-issue-12110 paths.", "tests": "At f507c0f: pnpm exec vitest run --maxWorkers=2 over 18 files, through the verify lock: Test Files 18 passed (18), Tests 571 passed (571), VERDICT command-exit 0. The 18 are: the 4 touched files (FormPage.richTextHints-12110, RichTextField.fullscreenDisabled, RichTextField.mobileFullscreen, readonly-richtext-display-5498); richtext-host-plumbing-e2e, readonly-host-plumbing-e2e, richtext-cell-renderer-5452, widget-aria-invalid-e2e, widget-aria-invalid-registry-e2e, widget-dom-leak-e2e, RichTextField.rows, richtext-field-metadata-7083; components fullscreen-editor-dialog-aria and form-fullscreen-flag-single-spelling; plugin-detail InlineFieldInput.markdownEditor-11541; app-shell richtextSurfaceParity; console FormPage.publicHeading; schema-catalog form-field-channel-census-12130. Reverse verification at f507c0f (the fix committed; a script with a trap restore and absolute paths, run under the lock): RichTextField.tsx and richTextDisplay.tsx overwritten with their d2500d8 blobs. On-disk hashes equal the BASE blobs 8a545a94 / d8c1de51; the marker 'It draws no header row.' went 1 to 0 and 'export function richTextSyntax' 0 to 1. The 4 touched files: 9 failed, 33 passed. Red: NO_HINT_LINE on the public and the internal route (expected 'Support requestRequestDetailsFormat: …' not to contain 'Format: markdown'; the same on 'Case intake…'), the 3 readonly-5498 discriminator cases, the 3 fullscreenDisabled cases (expected [ SPAN, SPAN ] to have a length of +0 but got 2) and the mobileFullscreen REAL-editor case. Green: both AUTHORED_GUIDANCE_STAYS controls. All failures are content assertions, none a harness death. Restored with git checkout HEAD --: on-disk hashes equal the HEAD blobs 392fb221 / 422a1543, git diff HEAD empty, 0 changed paths. Ablation resolution path: the vitest root alias and apps/console/vite.config.ts map @object-ui/fields to packages/fields/src, so no dist rebuild was needed. A first identical ablation at 529cb27 gave the same 9/33 split; f507c0f then switched the absence assertions from queryByText to queryAllByText length 0, so a red reads as a count instead of 'Found multiple elements'.", "gates": "Build (through the lock): turbo run build --filter='@object-ui/console^...' --concurrency=2 at 529cb27: Tasks 34 successful, 34 total, 17 cached, VERDICT command-exit 0. This is a superset of the dispatch's @object-ui/fields^... closure (11 tasks), needed for the console type-check; the later commit is test-only. type-check (lock): pnpm --filter @object-ui/fields --filter @object-ui/console run type-check at 529cb27, both echoed (fields: tsc --noEmit && tsc -p tsconfig.test.json; console: tsc --noEmit && tsc -b tsconfig.node.json --force), Done x2, VERDICT command-exit 0. fields type-check re-run at f507c0f: exit 0 (read through the && chain ahead of eslint; the lock printed batch-last-exit for that combined call). Console tsconfig includes src with no test exclude. ESLint, narrowed to the 6 changed TS files at f507c0f: --format json counts 5 files in packages/fields and 1 in apps/console, 0 errors, 13 warnings, all on lines outside this diff's hunks (10 no-explicit-any in readonly-5498, 3 react-refresh/only-export-components in richTextDisplay). Population: each package's lint is eslint ., resolved by the root flat config (no package-level config). Invariance: no parserOptions.project / projectService (no type-aware linting), and no eslint-rules/ rule reads other files. Full pnpm lint is CI's. Gates at f507c0f, each exit 0: node scripts/check-changeset-presence.mjs (6 source files of 2 released packages, 1 changeset); pnpm check:changeset-claims; pnpm check:pending-changeset-literals; pnpm check:control-bytes (8416 files); pnpm check:new-line-citations (VERDICT new-cross-file-line-citations: 0 new citation(s)); pnpm check:phantom-deps; pnpm check:i18n-keys; pnpm check:i18n-dead-keys (report-only; lists fields.richText.basicEditorHint and fields.richText.format as [confirmed]). Also check-governed-queue-guard --test over the 8 paths: NOT GOVERNED. Control-byte self-scan of the changed files: no hit. CI read once at 2026-10-12T01:10Z on f507c0f: 42 check runs, 20 success, 3 skipped, 19 in_progress, 0 failure; Spec Main Shape Gate in_progress (the dispatch reports it red repo-wide at flow-node-refs.ts, which objectui#12170 is fixing; this PR does not touch that file). Not awaited.", "line_budget": "Against base d2500d8: 8 files, +297 / -96. Non-test: 4 files, +37 / -62 (RichTextField.tsx +28/-39, richTextDisplay.tsx -22, rich-text.mdx +2/-1, changeset +7). Tests: 4 files, +260 / -34, of which the new console pin is +210. Neither the claim nor the dispatch declared a line budget.", "mcp_calls": "0 — no MCP GitHub tool called (GitHub reads went through gh api GETs; the Skill tool loaded objectui-contributor, which is not MCP).", "api_writes": "2 relay strokes (fleet-write dispatch, landing as objectstack-fleet[bot]): (1) pr_create = POST /repos/objectstack-ai/objectstack/dispatches carrying POST /repos/objectstack-ai/objectui/pulls (draft) + POST /repos/objectstack-ai/objectui/issues/12173/assignees [os-steve]; run 38190834186 success; read back 9322/9322 bytes identical, assignees os-steve. (2) this os-dev-report comment = POST /repos/objectstack-ai/objectui/issues/12110/comments through post-stamped. Plus git push x3 (empty-branch probe, 529cb27, f507c0f), not REST. Zero label writes, no PR-body PATCH, no write to objectstack-ai/objectstack beyond the relay's own dispatch.", "open_questions": [], "out_of_scope_findings": [ "carrier: whoever next edits the @object-ui/i18n packs · noted, not filed — fields.richText.format and fields.richText.basicEditorHint have no reader after this PR (check:i18n-dead-keys lists both [confirmed]). They are kept as ruled: deleting them would narrow the published TranslationKeys. In the PR's Acceptance notes. Dedupe words: richText basicEditorHint dead locale key", "carrier: none · noted, not filed — content/docs/fields/rich-text.mdx: its Cell Renderer section says grids show rich text as plain text, while its Features list (and getCellRenderer) render it formatted. The contradiction predates this PR, which does not change it. In the PR's Acceptance notes." ], "deviations": [ "File surface beyond the claim (6115774198), both forced by the removal and named in the PR body. (a) richTextDisplay.tsx: richTextSyntax is deleted (code plus its doc comment); the claim allowed comment-only lines. The function's only call site was the removed header, it is not on the package entry, and leaving it would have meant an orphan export with a rewritten comment. (b) content/docs/fields/rich-text.mdx: one sentence ('a plain textarea with a format indicator') that the change made false. The seat amends the claim.", "RichTextField.mobileFullscreen.test.tsx is a third test the claim's list did not name. It falls under 'the existing packages/fields tests that assert the two lines' and got the same present-to-absent flip. In fullscreenDisabled, the case's 'same surface' vehicle moved from the removed label to an authored placeholder counted twice, the vehicle mobileFullscreen already used.", "Build gate ① ran as the console closure (@object-ui/console^..., 34 tasks), a superset of @object-ui/fields^..., because the console pin owes a console type-check. Console type-check was read at 529cb27; the f507c0f commit is test-only, inside packages/fields, and fields type-check was re-run there.", "ESLint was run narrowed to the 6 changed TS files, with the three pieces of evidence in gates; not as the package-level eslint . form.", "Attribution: commits carry the model-free trailer pair (Co-authored-by: Claude, Claude-Session) per AGENTS.md, and the PR body ends with the session-URL footer per the os-dev definition. Both replace the harness reminder's model-named Co-Authored-By and its PR footer form; the harness reminder yields to those rules.", "Cleanup done: worktree /home/user/objectui-issue-12110 removed without --force after its node_modules were deleted; the branch was fully pushed (local == remote f507c0f). No background process of this run remains: the one build run with nohup was awaited with tail --pid and exited 0. The scratchpad PR-body and actions files were deleted after use." ], "files_changed": [ ".changeset/12110-richtext-editor-hints.md", "apps/console/src/components/FormPage.richTextHints-12110.test.tsx", "content/docs/fields/rich-text.mdx", "packages/fields/src/__tests__/readonly-richtext-display-5498.test.tsx", "packages/fields/src/widgets/RichTextField.tsx", "packages/fields/src/widgets/__tests__/RichTextField.fullscreenDisabled.test.tsx", "packages/fields/src/widgets/__tests__/RichTextField.mobileFullscreen.test.tsx", "packages/fields/src/widgets/richTextDisplay.tsx" ] }
Generated by Claude Code
objectstack-fleet commented
on Oct 12, 2026 ContributorAuthorMore actionsACCEPT: PR objectui#12173 (head
f507c0f5ec) ·domain:uiseat 1 ·session_016djJF12Qt14ejKR5Vjt4sK· 2026-10-12T01:14ZReviewed against GitHub and the diff, not the report (
os-dev-report6115999507). Ruling:6115662567(B).Verdict
- Shape:
- Draft on
main. The first line isFixes #12110, andClause-②: nosits at a line start. - No other card number sits next to a closing keyword.
- Assignee
os-steve.
- Draft on
- Scope: 8 files, +297/−96. Nothing under
content/docs/releases/.check-governed-merges --pr objectstack-ai/objectui#12173: NOT governed, 393 changed lines. - The ruling, read in the diff:
RichTextEditorSurfacedraws no header row. ItsformatLabel/hintprops are gone, and so are the twot()calls.- Both renderings, inline and the fullscreen dialog, go through that one surface, so the lines are gone on every page.
placeholderand the host's help text are unchanged.- The wrapper
divlostspace-y-2. Its only child now is therelativediv, so no spacing changes.
- Accepted surface extensions, each forced by the removal (this record amends the claim's surface):
richTextSyntaxdeleted fromwidgets/richTextDisplay.tsx, doc comment and all, beyond the comment-only lines the claim allowed. Its only reader was the removed header.- It is not on the package entry:
packages/fields/src/index.tsxre-exports onlyMarkdownCellRenderer,HtmlCellRenderer,RICH_TEXT_FIELD_TYPESandRichTextFieldTypefrom that module, by name. - So nothing published moves.
- It is not on the package entry:
content/docs/fields/rich-text.mdx: the one sentence ("a plain textarea with a format indicator") that this change made false.RichTextField.mobileFullscreen.test.tsx, a third test that asserted the label. It flips from present to absent and stays load-bearing.
- The pin:
apps/console/src/components/FormPage.richTextHints-12110.test.tsxrendersmarkdown,htmlandrichtextfields on the public/f/:slugroute and on an internal form route.- The
NO_HINT_LINEleg checks that no hint line is drawn. - The
AUTHORED_GUIDANCE_STAYScontrol checks that the placeholder reaches the editor and the help text renders. - A harness-death guard names its own failure, so a dead harness is never read as a hint found or missed.
- That is the ruling's "the anonymous public form and an internal console form", worded as ruled.
- The
- Evidence: with
RichTextField.tsxandrichTextDisplay.tsxreverted to their base blobs, the four touched test files go 9 red / 33 green.- The red:
NO_HINT_LINEon both routes, the three readonly-5498 discriminators, the three fullscreenDisabled cases, and the mobileFullscreen real-editor case. - Both controls stay green.
- The restore was blob-equal to HEAD.
- The red:
Clause-②: no: no export, prop, type member or locale key moves.- The ten packs keep
fields.richText.formatandfields.richText.basicEditorHint, as ruled ("No contract change, … no locale key"). - Changeset:
@object-ui/fieldspatch.
- The ten packs keep
- Gates on this head (read at this record): 25 success, 3 skipped by design, 14 in progress.
Spec Main Shape Gatewill read the repo-wide red atflow-node-refs.ts:145, which this PR does not touch.- Its fix, PR objectui#12172 (objectui#12170), is in the merge queue now.
Out-of-scope findings
fields.richText.formatandfields.richText.basicEditorHinthave no reader after this PR (check:i18n-dead-keyslists both as confirmed). Acceptance notes. The ruling keeps them, since deleting them would narrow the publishedTranslationKeys. They go out with the next deliberate pack narrowing, which owes its own contract review.content/docs/fields/rich-text.mdx: the Cell Renderer section says grids show rich text as plain text, but the Features list andgetCellRendererrender it formatted. Acceptance notes. It predates this PR and is outside its surface.
Acceptance notes
- Build gate ① ran as the
@object-ui/console^...closure (34 tasks), a superset of the dispatch's, because the console pin owes a console type-check. - ESLint ran narrowed to the six changed TS files, with the dev's invariance evidence. The full lint is CI's.
Landing: waits on objectui#12170's merge. Then the seat syncs this PR with
mainthrough the relay. Once every check issuccessor skipped by design, the seat marks it ready and turns on auto-merge through the merge queue.
Generated by Claude Code
- Shape:
objectstack-fleet commented
on Oct 12, 2026 ContributorAuthorMore actionsLanded: PR objectui#12173 →
main2498a07·domain:uiseat 1 ·session_016djJF12Qt14ejKR5Vjt4sK· 2026-10-12T02:09Z- The merge: through the merge queue, on top of
e531116(PR objectui#12168, this seat's objectui#12141). The card closed ascompletedthroughFixes #12110. Its remaining scope was item 7's second half; items 1–6 and item 7's heading had landed in PR objectui#12151. No other card closed with it. - Content check: all 8 files the PR changes are blob-identical at
2498a07to the accepted headf507c0f5ec, which ACCEPT6116019043covers. The only commit between them is the relay's base sync66b7a01, whose second parent is4baa8a6. The siblings that merged in between share no file with this PR. - On
mainnow (ruling6115662567, B): the rich-text editor draws no "Format: …" or "Rich text editor (basic)" line, inline or in the fullscreen dialog, on public and internal forms alike. The field's placeholder and help text are unchanged.@object-ui/fieldspatch. - Left as ruled:
fields.richText.formatandfields.richText.basicEditorHintstay in the ten packs with no reader. - State:
pm:dispatchedis removed in this act.domain:ui,area:recordsand the grade stay.
Generated by Claude Code
- The merge: through the merge queue, on top of
Ruled: 6115662567 · letter B · 2026-10-12T00:35Z
Filing gate ①: seven small rendering defects measured at a public door (findings A-02, A-03, B-13, B-14, B-20, C-18, A-09, B-08). Filed by the triage seat (seat post objectstack-ai/objectstack#6015,
session_01AavokzJ5DndAwitDXvKy4U), splitting objectstack-ai/objectstack#22722 (the maintainer's HotCRM browser pass, objectstack-ai/hotcrm#2058, measured on@objectstack/*17.7.0).⛔ Not a claim.One card on purpose: each item is a few lines in one file, all are
domain:ui, and none needs a decision. One PR, with a pin per item.Items (read on objectui
maince991bd70f)labelloses to the field label (A-02).packages/plugin-grid/src/ObjectGrid.tsxabout:3508–:3511passescol.labelas the fallback of a translated field-label lookup.type: ratingwithwidget: 'star_rating'renders as a text box (A-03).packages/components/src/renderers/form/form.tsxresolveswidgetfirst (about:3131), finds nofield:star_rating, and falls to the default text input (about:4480).typerenderer".packages/fields/src/index.tsx(about:3769) mapsratingcells to a number.typerenderer, and giveratinga rating cell.nameField(B-13).packages/plugin-detail/src/renderers/record-reference-rail.tsxpickDisplayName(about:226–:245) uses a fixed ladder, and the fetch (about:440–:460) keeps only.fieldsof the target schema.refreshAfter: truedoes not refresh the reference rail (B-14).parentId::entriesSig(about:304,:370–:377) and does not subscribe to the data-invalidation bus.RecordDetailView.tsxnotifyRecordChanged(about:557,:1116) posts only there.packages/plugin-gantt/src/GanttView.tsxformats{ month, day }at about:3978,:4000,:4013,:4302,:4522and:4837. Show the year at least when it is not the current one.apps/console/src/pages/system/ApprovalsInboxPage.tsx:formatIdentity(about:222–:228) cuts a long id in the middle ("positi…ager"). Aposition:<p>approver should show the position's label.decisionAmountEntry(about:632–:656) takes the first key matchingAMOUNT_KEY_RE, even a zero "Child Account Revenue". Prefer the object's declared amount field, and never headline a zero from an unrelated key.3409fe89e4, after the 17.7.0 pin) draws them throughRecordFieldFace. console (17.7.0): seven UI defects measured in one full browser pass of a metadata app — missing Edit, capped calendar, page-only footer sum, ignored password, and three affordances shown to users who cannot use them #12081 item 7 can close against it once checked.apps/console/src/components/FormPage.tsxloadPublicForm(about:1436) falls back to the object's API name. Use the object's label.packages/fields/src/widgets/RichTextField.tsxabout:417–:418shows "Format: markdown" and "Rich text editor (basic)" to anonymous visitors. Hide editor hints on the public surface.Not in this card: a completed task's due date shown as "Overdue" (C-19) is #11815, on hold until objectui installs a spec release with
settledWhen.domain:ui· p3.