- Shipped
- August 6, 2026 at 7:19 PM UTC
- Author
- kamo
- Commit
- 9aabfa4
canFinish required every document row to already be SIGNED/ACKNOWLEDGED, but **************** is the ONLY writer of those statuses — the delivery worker writes PENDING and void/redelivery write VOIDED. Finish was therefore gated on its own side effect and permanently disabled for any package with at least one document; only a zero-document package could ever execute. Completion is now the union of the row status, ESigService's live recipient status, and what this wizard session watched happen. The same root cause broke resume: firstIncompleteStepIndex always resolved to step 0, so a member who closed the tab mid-package was walked back into a signing session for a document they had already signed and met a 409 from EsignPublicService.submit with no way out. DocumentStep now reads the session's own recipientStatus before it offers a signing surface, and treats a 409 whose recipient is SIGNED as a completed step. **************** was linked from nowhere — the phase's whole deliverable was unreachable. It is now a self-only tab on the member settings page, gated on identity (never checkRight, which is true for every right under god mode) and on organization.isDocs. validateFieldValue — the format half of the ported validation engine — was exported and imported by nothing, so **************** min/max length and the designer's regex were enforced in neither the wizard nor ESigService. fieldErrors.ts wires it in and isReadyToFinish now refuses a filled-but-malformed field; the description is built from designer DATA because the engine's errorKeys belong to kamo-signer's dictionary. Also: a step-up envelope says so instead of dead-ending at an inert Finish (EsignMemberController has no /stepup by design); the AWAITING_OTHERS row no longer repeats its own status chip in the action slot; the executed section heading is common.states.complete rather than a mortgage field label.