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 }}
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
Repository navigation
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
Findings triage (15:47Z fire) — HOLD confirmed, premise re-verified.
Re-checked against origin/main: both implementations are still present and independent — FullscreenTextarea in packages/components/src/renderers/form/form.tsx, FullscreenFieldEditor in packages/fields/src/widgets/. The hold's stated basis also verifies: the concrete drift (#3400) is fixed and pinned, and the pin is real — form-fullscreen-textarea-readonly-disabled.test.tsx now sits alongside the i18n and label pins in the same directory. So the residual question is unchanged and is still a boundary ruling, not a merge chore: option A requires packages/components ("Pure UI, no business logic") to take on a draft/commit state machine, and option B's alignment-test cost was already re-estimated upward by #3400. Hold stands, still bundled with the #3439 built-in-form-branch parity ruling.
Findings triage (re-verification round) — HOLD confirmed, finding retained.
Premise re-checked on origin/main @ cdc0e44: both implementations still present and independent — FullscreenTextarea at packages/components/src/renderers/form/form.tsx:432 (moved from :357; re-anchor from there) and FullscreenFieldEditor at packages/fields/src/widgets/FullscreenFieldEditor.tsx:181. The blocking question is unchanged: the A/B/C boundary ruling for packages/components ("Pure UI, no business logic" vs a draft/commit state machine), still bundled with #3439's built-in-form-branch parity ruling, still un-adjudicated. No restart condition has fired.
Finding-triage ruling: Escalate — finding to needs-user-decision.
Two implementations of the fullscreen text editor (FullscreenTextarea in components at form.tsx:432, FullscreenFieldEditor in fields at :181) already drifted once — #3400, fixed and pinned. The merge is blocked purely on the dependency direction between components and fields, and all four holds on this card plus #3439's end at the same sentence: awaits the maintainer's boundary ruling. Holding further only accrues re-verification cost.
Question for the maintainer: pick the boundary — A allow the dependency and merge into one implementation, B lift the shared editor into a lower package both can import, or C bless the duplication with a parity pin. #3439 (built-in textarea character count) reprices automatically with this answer.
Authorization: maintainer directive (this session) —「对于issue中的findings 执行一次集中分诊,并更新issue 的状态。」Centralized pass under that directive; finding grading is normally the triage seat's single channel. Round: objectstack#4949 finding-triage, 2026-08-10.
Session: 01JaVVMrSxt7Tgi1uwEuDtH7
Maintainer ruling (2026-08-10, directed in session session_01BPWqbmEFU8gJepBJTHESXd): one implementation, hoisted to the dependency-legal side.
Hoist the shared fullscreen-editor primitive into the package both sides may depend on (components), and make the fields-side FullscreenFieldEditor a thin wrapper over it. If the measured import graph makes that direction impossible, report the graph on this card before merging the other way — do not resolve the dependency block by keeping two implementations.
Claim: PM loop round 6 (rolling slot refill; maintainer-ruled card — ruling of 2026-08-10 05:12 in the comment above)
Session: session_017Qqyix2QcnpUC9XeYVDzx3 · Branch: claude/issue-3398-fullscreen-editor-hoist · Worktree: objectui-issue-3398
File surface: packages/components (the hoisted primitive + form.tsx's FullscreenTextarea retirement onto it) + packages/fields (FullscreenFieldEditor → thin wrapper; TextAreaField/RichTextField untouched unless the wrapper's contract forces it) + tests both sides. Serial constraints: disjoint from #4167/#2627/#4178/#4181 in flight (#2627 is AI chat, different components area).
Container & model: M, mode:subagent, model: opus
Binding context beyond the ruling text: the #3400 lesson is load-bearing — FullscreenFieldEditor greps zero for readonly/disabled (shielded only by TextAreaField's early return), while the components side carries the #3400 fix and its pin (form-fullscreen-textarea-readonly-disabled.test.tsx). The hoisted primitive must therefore DEFINE the readonly/disabled semantics explicitly (the merged single implementation owns them; both call paths inherit them), and the #3400 pin must keep passing against the merged code. The escape hatch is verbatim from the ruling: if the measured import graph blocks the hoist, REPORT THE GRAPH on the card before merging the other way. #3439 (character-count parity) reprices with this card but is NOT in scope.
Executed per the maintainer's ruling (hoist to @object-ui/components), and the ruling's legality was measured before the first edit: fields → components is the existing dependency direction and components names fields nowhere, so the escape hatch stayed shut. The primitive now defines readonly/disabled rather than inheriting them — readOnly renders no affordance, disabled leaves an inert one, gated at open / injected editor / Done / onCommit (covering the isSubmitting flip mid-dialog) — and the #3400 pin passes unmodified against the merged code, which is the whole point of the card.
Two corrections to the dispatch's binding context, both surfaced rather than worked around, both accepted: (1) the "fields side greps zero for readonly/disabled" claim had expired — #3402/#3404 already hardened that copy, so this was a union of two hardened implementations, with the readonly half of the lesson still live and load-bearing; (2) toggleClassName has zero producers repo-wide and was never exported from the fields barrel, so it was correctly NOT carried onto the new public export — minting a producer-less prop on a fresh public API is exactly the #3232/#3233 shape.
Three reverse probes, all red in the predicted direction: readonly gate deletion → #3400 pin red; wrapper dropping disabled → 9/21 red including the write-back gate; toggleClassName+readOnly paste → TS2322, proving tsc read the rebuilt cross-package .d.ts. Full suites, 31-consumer type-check sweep, i18n byte-drift zero, CI converged 20/20 (18 success + 2 path-filter skips). Changeset components:minor + fields:patch accepted. Flipping ready + auto-merge.
Activity
yinlianghui commentedon Aug 5, 2026
交叉引用:本条正文里「两份实现目前行为一致,用户碰不到差异」这句已经被证伪,详见刚开的 #3400(实测,非静态推断)。
差异点是
readonly/disabled:TextAreaField.tsx:40在readonly时提前返回只读展示,全屏按钮根本不渲染;FullscreenTextarea两个状态都不认 —— 只读长文本连内联控件都能直接改(readonly在renderFieldComponent入口就被解构走了,全屏出口没转发),禁用字段虽然内联控件是灰的,但展开按钮可点、对话框可改、「完成」把值写回表单状态。对本条的影响只有一处:它现在不再只是漂移风险,漂移已经发生了,而且是用户可见的。选项 B(维持两份 + 加对齐测试)的成本因此要重估 —— 对齐测试的第一条用例就是这个,而且得先把内置分支修到与注册路径一致才谈得上「对齐」。另外
FullscreenFieldEditor自己 grepreadonly|readOnly|disabled零命中,它只是被TextAreaField的提前返回挡着;所以选项 A(下沉合并)要把这两个状态的语义在合并时定义出来,不能假设搬过去就自带。裁决本身仍归本条,#3400 只记缺陷。
Generated by Claude Code
yinlianghui commentedon Aug 6, 2026
发现分诊轮(持有):前提 live(双全屏编辑器并存),但具体漂移(#3400)已单修并有 pin;合并本体需先裁 packages/components 边界方向(A/B/C),与 #3439 同属「内建 form 分支 parity」一揽子裁决,待维护者。(objectui 分片 PM,会话
session_01GTRjn8xBqp75dk7kFupVRt)Generated by Claude Code
claude commentedon Aug 7, 2026
Findings triage (15:47Z fire) — HOLD confirmed, premise re-verified.
Re-checked against
origin/main: both implementations are still present and independent —FullscreenTextareainpackages/components/src/renderers/form/form.tsx,FullscreenFieldEditorinpackages/fields/src/widgets/. The hold's stated basis also verifies: the concrete drift (#3400) is fixed and pinned, and the pin is real —form-fullscreen-textarea-readonly-disabled.test.tsxnow sits alongside the i18n and label pins in the same directory. So the residual question is unchanged and is still a boundary ruling, not a merge chore: option A requirespackages/components("Pure UI, no business logic") to take on a draft/commit state machine, and option B's alignment-test cost was already re-estimated upward by #3400. Hold stands, still bundled with the #3439 built-in-form-branch parity ruling.本评论来自分诊座位 Routine(#5474 试点),不构成认领。
Generated by Claude Code
os-zhuang commentedon Aug 9, 2026
Findings triage (re-verification round) — HOLD confirmed,
findingretained.Premise re-checked on
origin/main@cdc0e44: both implementations still present and independent —FullscreenTextareaatpackages/components/src/renderers/form/form.tsx:432(moved from:357; re-anchor from there) andFullscreenFieldEditoratpackages/fields/src/widgets/FullscreenFieldEditor.tsx:181. The blocking question is unchanged: the A/B/C boundary ruling forpackages/components("Pure UI, no business logic" vs a draft/commit state machine), still bundled with #3439's built-in-form-branch parity ruling, still un-adjudicated. No restart condition has fired.本评论来自分诊座位 Routine(#5474 试点),不构成认领。
Generated by Claude Code
os-zhuang commentedon Aug 10, 2026
Finding-triage ruling: Escalate —
findingtoneeds-user-decision.Two implementations of the fullscreen text editor (FullscreenTextarea in components at form.tsx:432, FullscreenFieldEditor in fields at :181) already drifted once — #3400, fixed and pinned. The merge is blocked purely on the dependency direction between components and fields, and all four holds on this card plus #3439's end at the same sentence: awaits the maintainer's boundary ruling. Holding further only accrues re-verification cost.
Question for the maintainer: pick the boundary — A allow the dependency and merge into one implementation, B lift the shared editor into a lower package both can import, or C bless the duplication with a parity pin. #3439 (built-in textarea character count) reprices automatically with this answer.
Authorization: maintainer directive (this session) —「对于issue中的findings 执行一次集中分诊,并更新issue 的状态。」Centralized pass under that directive; finding grading is normally the triage seat's single channel. Round: objectstack#4949 finding-triage, 2026-08-10.
Session: 01JaVVMrSxt7Tgi1uwEuDtH7
Generated by Claude Code
os-zhuang commentedon Aug 10, 2026
Maintainer ruling (2026-08-10, directed in session
session_01BPWqbmEFU8gJepBJTHESXd): one implementation, hoisted to the dependency-legal side.Hoist the shared fullscreen-editor primitive into the package both sides may depend on (
components), and make the fields-sideFullscreenFieldEditora thin wrapper over it. If the measured import graph makes that direction impossible, report the graph on this card before merging the other way — do not resolve the dependency block by keeping two implementations.needs-user-decision→pm:queue.Generated by Claude Code
yinlianghui commentedon Aug 10, 2026
Claim: PM loop round 6 (rolling slot refill; maintainer-ruled card — ruling of 2026-08-10 05:12 in the comment above)
Session:
session_017Qqyix2QcnpUC9XeYVDzx3· Branch:claude/issue-3398-fullscreen-editor-hoist· Worktree:objectui-issue-3398File surface:
packages/components(the hoisted primitive +form.tsx's FullscreenTextarea retirement onto it) +packages/fields(FullscreenFieldEditor → thin wrapper; TextAreaField/RichTextField untouched unless the wrapper's contract forces it) + tests both sides. Serial constraints: disjoint from #4167/#2627/#4178/#4181 in flight (#2627 is AI chat, different components area).Container & model: M,
mode:subagent,model: opusBinding context beyond the ruling text: the #3400 lesson is load-bearing —
FullscreenFieldEditorgreps zero for readonly/disabled (shielded only by TextAreaField's early return), while the components side carries the #3400 fix and its pin (form-fullscreen-textarea-readonly-disabled.test.tsx). The hoisted primitive must therefore DEFINE the readonly/disabled semantics explicitly (the merged single implementation owns them; both call paths inherit them), and the #3400 pin must keep passing against the merged code. The escape hatch is verbatim from the ruling: if the measured import graph blocks the hoist, REPORT THE GRAPH on the card before merging the other way. #3439 (character-count parity) reprices with this card but is NOT in scope.Generated by Claude Code
yinlianghui commentedon Aug 10, 2026
ACCEPT (objectui seat PM, session
session_017Qqyix2QcnpUC9XeYVDzx3, review of record) — PR #4193.Executed per the maintainer's ruling (hoist to
@object-ui/components), and the ruling's legality was measured before the first edit:fields→componentsis the existing dependency direction andcomponentsnamesfieldsnowhere, so the escape hatch stayed shut. The primitive now defines readonly/disabled rather than inheriting them — readOnly renders no affordance, disabled leaves an inert one, gated at open / injected editor / Done / onCommit (covering the isSubmitting flip mid-dialog) — and the #3400 pin passes unmodified against the merged code, which is the whole point of the card.Two corrections to the dispatch's binding context, both surfaced rather than worked around, both accepted: (1) the "fields side greps zero for readonly/disabled" claim had expired — #3402/#3404 already hardened that copy, so this was a union of two hardened implementations, with the readonly half of the lesson still live and load-bearing; (2)
toggleClassNamehas zero producers repo-wide and was never exported from the fields barrel, so it was correctly NOT carried onto the new public export — minting a producer-less prop on a fresh public API is exactly the #3232/#3233 shape.Three reverse probes, all red in the predicted direction: readonly gate deletion → #3400 pin red; wrapper dropping
disabled→ 9/21 red including the write-back gate;toggleClassName+readOnlypaste → TS2322, proving tsc read the rebuilt cross-package .d.ts. Full suites, 31-consumer type-check sweep, i18n byte-drift zero, CI converged 20/20 (18 success + 2 path-filter skips). Changeset components:minor + fields:patch accepted. Flipping ready + auto-merge.Generated by Claude Code
refactor(components,fields): one fullscreen long-text editor, hoisted…