Stage-6 MAF frontend foundation plus P1 approval safety hardening:
- Add lib/safe-display.ts: single-source safeDisplayJson that deletes
sensitive keys (never renders as ***), recurses with depth/array/field/
string caps, returns hiddenCount + truncated.
- MafApprovalCard & MafActionAuditPanel both use safeDisplayJson; remove
private sanitize duplicates. Panels hide entirely when nothing is left.
- Lock the card on both approve AND reject (resuming state) since the
backend advances the workflow on either decision; add a decisionLockRef
sync guard so a double-click before React re-render cannot fire a second
mutate. Status text becomes '正在同步工作流…'.
- Stage-6 base shipped here as prerequisite: self-contained maf-flow-graph
(no roundtable-planning dep), MafFlowGraphDialog/MafFactLedgerPanel/
MafActionAuditPanel, shared risk-theme/action-audit/approval-state/
run-resume libs, mergeBySeq export, canResume wiring, TButton icon fixes.
- Tests import real functions only; 48 pass (adds 8 safeDisplayJson cases).