Verified defect
Protected develop@2c328875e00e86537df3e965170be80532571cad still normalizes work-item fields with truthiness fallback such as String(draft?.[field] || ''). A current-head review of PR #608 independently reproduced the consequence on the active branch: legitimate numeric 0 values can be converted to the empty string while an item is normalized for editing/saving. The affected numeric fields include at least budget, actualCost, and storyPoints; the same coercion pattern must be audited at external-record normalization boundaries as well.
This is data-integrity behavior, not an accessibility-only concern. 0 is a meaningful business value and must remain distinguishable from null/undefined/missing.
Required repair contract
- Add a realistic RED regression before production mutation proving numeric zero survives the actual normalization path. Cover
budget: 0, actualCost: 0, and storyPoints: 0 independently and in combination.
- Exercise at least one buyer-visible round trip (edit/save/reopen or import/normalize/render/export, whichever owns the affected path) so the test cannot pass through an assertion-only helper stub.
- Audit both
sanitizeDraft() and createNormalizedExternalRecord() (and any semantically identical coercion) for || '' fallback on values where zero is valid.
- Apply the smallest root-cause fix: distinguish absence (
null/undefined) from numeric zero, e.g. a nullish fallback at the owning coercion boundary. Do not broadly normalize unrelated boolean/string semantics.
- Run the focused regression, canonical unit/browser path, and exact owned-production coverage; preserve existing validation, CSV safety, and editor accessibility behavior.
- Revalidate the exact contributor head and protected base after the change.
Writer/stack boundary
PR #608 currently owns and is actively moving overlapping app.js accessibility work through Jules, so do not race that branch. Refetch its exact head and active-writer evidence first. If it remains actively moving, keep this defect tracked here and repair it on the settled current owning app.js lane rather than creating a competing overlapping source write. This issue is not permission to defer once that collision clears.
Acceptance
A persisted/imported work item containing numeric zero in each supported numeric field must emerge from normalization with a zero-equivalent value rather than '', while missing values continue to follow the existing empty-value contract and all existing tests remain green.
Verified defect
Protected
develop@2c328875e00e86537df3e965170be80532571cadstill normalizes work-item fields with truthiness fallback such asString(draft?.[field] || ''). A current-head review of PR #608 independently reproduced the consequence on the active branch: legitimate numeric0values can be converted to the empty string while an item is normalized for editing/saving. The affected numeric fields include at leastbudget,actualCost, andstoryPoints; the same coercion pattern must be audited at external-record normalization boundaries as well.This is data-integrity behavior, not an accessibility-only concern.
0is a meaningful business value and must remain distinguishable fromnull/undefined/missing.Required repair contract
budget: 0,actualCost: 0, andstoryPoints: 0independently and in combination.sanitizeDraft()andcreateNormalizedExternalRecord()(and any semantically identical coercion) for|| ''fallback on values where zero is valid.null/undefined) from numeric zero, e.g. a nullish fallback at the owning coercion boundary. Do not broadly normalize unrelated boolean/string semantics.Writer/stack boundary
PR #608 currently owns and is actively moving overlapping
app.jsaccessibility work through Jules, so do not race that branch. Refetch its exact head and active-writer evidence first. If it remains actively moving, keep this defect tracked here and repair it on the settled current owningapp.jslane rather than creating a competing overlapping source write. This issue is not permission to defer once that collision clears.Acceptance
A persisted/imported work item containing numeric zero in each supported numeric field must emerge from normalization with a zero-equivalent value rather than
'', while missing values continue to follow the existing empty-value contract and all existing tests remain green.