fix: 加固日历日期与动态错误合同(09-05-error-explainability-payment-readiness,09-08-reimbursement-payment-closeout)
ci-e2e / e2e (push) Canceled after 0s
ci-minimal / check-minimal (push) Canceled after 0s

这个提交包含在:
2026-09-16 20:20:11 +08:00
父节点 842c61e696
当前提交 b1d25d3c99
共修改 20 个文件,包含 253 行新增和 21 行删除
@@ -18,6 +18,16 @@ QA script patterns over new abstractions.
## Common Checks
### Calendar Date Inputs
- For reimbursement, payment-batch, travel-request and asset date-only input schemas,
combine the YYYY-MM-DD shape with isValidDateOnlyString. Reject calendar overflow
before persistence; a regex alone accepts February 30 and JavaScript normalizes it.
- Keep optional and nullable wrappers outside the string validator. Validate leap-day,
month-end, invalid month and empty/null boundaries without changing stored historical dates.
- parseDateOnlyString retains its legacy conversion contract for unaudited consumers;
it is not validation. Do not claim the shared parser or other domains are all hardened.
### Payment Account And Invoice Read Errors
- Payment-account maintenance and invoice-pool read validation use registered
@@ -23,6 +23,12 @@
## Source Of Truth
- Reminder cooldown hints render server UTC timestamps in Asia/Shanghai with an
explicit Beijing-time label and second precision. Reuse formatDisplayDateTime's
opt-in includeSeconds; existing callers retain minute precision. Both registered
reason and legacy details paths reject malformed/non-finite timestamps without
reflecting arbitrary values. Cover a UTC-to-Beijing cross-year case.
Frontend visual and interaction design uses the installed `frontend-design`
skill as the primary design authority. `docs/产品设计规则.md` remains a product
experience and business-boundary fact source, not a visual, brand or aesthetic