Filed by the domain:ui execution seat (PM session session_013hfmP9hoMd3dJwTh85J4yB), out of #6868's mandatory enumeration. ⛔ Recording, not claiming — priority:* is triage's.
The fact
packages/plugin-detail/src/InlineCreateRelated.tsx:159-163 carries its own required-field gate, isCreateValid, which decides presence by truthiness after trim.
⇒ It rejects false and 0 as "missing". A boolean field set to false, or a number field set to 0, is a present value — and this gate reads it as absent.
That is not a hypothetical divergence: it is the exact case the reference implementation goes out of its way to handle. packages/components/src/renderers/form/form.tsxdeletes rules.required from what buildValidationRules produced and re-expresses it as a validate entry, specifically because react-hook-form's own required is wrong for booleans (cloud#972). ⇒ The repo has already ruled, in code, that truthiness is the wrong presence test — and this surface re-derived it anyway.
Why it exists at all, and why that matters more than the bug
InlineCreateRelated is one of 10 editing entry points across 8 packages that bypass buildValidationRules entirely (measured in #6868, pathspec bound: packages/*/src/** + apps/*/src/**, 1,062 files, tests excluded; validated set is plugin-form only).
⚠️Two of those ten have already grown their own required-only checks:
| site | its own gate |
|---|
plugin-kanban/RequiredFieldsDialog.tsx:114 | isMissingForRequired |
plugin-detail/InlineCreateRelated.tsx:159-163 | isCreateValid — this card |
⭐ Triage warned on #6868 that writing a second validation implementation would mean 另写一套等于制造第三份规则来源. The measurement says it has already happened twice, before anyone proposed it. This card is the one where the duplicate is also wrong; the other is currently correct-by-luck and is a latent instance of the same shape.
What is NOT claimed
The narrow fix, if the reading holds
Replace truthiness-after-trim with the repo's presence contract (value !== undefined && value !== null && value !== '', matching what form.tsx's validate carve-out enforces). ⚠️ Narrow, because the general answer — one evaluator, consumed by every entry point — is #6868's decision and is deliberately out of scope here.
Reproduce
sed -n '155,170p' packages/plugin-detail/src/InlineCreateRelated.tsx
grep -n "rules.required" packages/components/src/renderers/form/form.tsx
sed -n '110,120p' packages/plugin-kanban/src/RequiredFieldsDialog.tsx
Related
Filed by the
domain:uiexecution seat (PM sessionsession_013hfmP9hoMd3dJwTh85J4yB), out of #6868's mandatory enumeration. ⛔ Recording, not claiming —priority:*is triage's.The fact
packages/plugin-detail/src/InlineCreateRelated.tsx:159-163carries its own required-field gate,isCreateValid, which decides presence by truthiness after trim.⇒ It rejects
falseand0as "missing". A boolean field set tofalse, or a number field set to0, is a present value — and this gate reads it as absent.That is not a hypothetical divergence: it is the exact case the reference implementation goes out of its way to handle.
packages/components/src/renderers/form/form.tsxdeletesrules.requiredfrom whatbuildValidationRulesproduced and re-expresses it as avalidateentry, specifically because react-hook-form's ownrequiredis wrong for booleans (cloud#972). ⇒ The repo has already ruled, in code, that truthiness is the wrong presence test — and this surface re-derived it anyway.Why it exists at all, and why that matters more than the bug
InlineCreateRelatedis one of 10 editing entry points across 8 packages that bypassbuildValidationRulesentirely (measured in #6868, pathspec bound:packages/*/src/**+apps/*/src/**, 1,062 files, tests excluded; validated set isplugin-formonly).plugin-kanban/RequiredFieldsDialog.tsx:114isMissingForRequiredplugin-detail/InlineCreateRelated.tsx:159-163isCreateValid— this card⭐ Triage warned on #6868 that writing a second validation implementation would mean 另写一套等于制造第三份规则来源. The measurement says it has already happened twice, before anyone proposed it. This card is the one where the duplicate is also wrong; the other is currently correct-by-luck and is a latent instance of the same shape.
What is NOT claimed
InlineFieldInputnever callsbuildValidationRulesand never gets anerrorprop #6868's open decision and is explicitly reserved for a maintainer ruling — this card must not pre-empt it.RequiredFieldsDialog's gate being wrong — it was not measured against the same cases, only observed to be a second independent implementation.The narrow fix, if the reading holds
Replace truthiness-after-trim with the repo's presence contract (⚠️ Narrow, because the general answer — one evaluator, consumed by every entry point — is #6868's decision and is deliberately out of scope here.
value !== undefined && value !== null && value !== '', matching whatform.tsx'svalidatecarve-out enforces).Reproduce
Related
InlineFieldInputnever callsbuildValidationRulesand never gets anerrorprop #6868 — where this was enumerated; carries the full 10-entry-point census and the reserved decisionValidationEngineis a second validation vocabulary with zero consumers and no barrel export #6964 — a third validation vocabulary:@object-ui/core'sValidationEngine/validateFields, snake_case, zero consumers, no barrel export