{"ns":"esign","title":"Quillmark eSign","version":"7.0","summary":"Quillmark eSign is a control panel for sending documents for electronic signature. A sender designs a workflow (recipients, document templates, placed fields), launches it as a transaction, and each recipient completes a signing ceremony through a personal link. A Mouse Lab page exercises pointer, scroll, hover and drag interactions.","problem":"Senders need to prepare multi-party signing packets accurately, with fields exactly where they were placed, and signers need a guided, tamper-resistant ceremony with a clear audit trail.","personas":[{"name":"Sender (agent / administrator)","need":"Build a workflow, place fields on pages, send it and track progress, decline and void outcomes."},{"name":"Signer","need":"Open a personal link, consent, adopt a signature, fill required fields and finish with confidence."},{"name":"Approver","need":"Sign only after earlier signers in the routing order have signed."}],"goals":["A field is stored exactly where the sender placed it, in page point coordinates, at any zoom level.","A workflow cannot be sent until every problem is fixed, and all problems are reported at once.","Signing is consent-gated, ordered, single-use and fully audited."],"features":[{"id":"AUTH","title":"Sign-in and session","summary":"Cookie-based sign-in for the control panel with protected routes.","reqs":[{"id":"FR-AUTH-01","weight":"Must","text":"Anonymous visits to any control-panel page redirect to the sign-in page with the original path preserved; valid credentials open the dashboard.","accept":["Visiting the dashboard anonymously redirects to the sign-in page with ?next=/cp/dashboard and heading \"Sign in to the eSign Control Panel\"","After sign-in the dashboard heading is \"eSign Control Panel\" with \"Welcome back, <name>.\"","The user menu shows the email and role and a \"Sign Out\" entry"]},{"id":"FR-AUTH-02","weight":"Must","text":"Failed sign-ins show distinct messages for missing and wrong credentials and do not leave the sign-in page.","accept":["Empty fields: \"Enter your username and password.\"","Wrong credentials: \"Invalid username or password.\""]},{"id":"FR-AUTH-03","weight":"Should","text":"After sign-in the user lands on the page originally requested; signing out protects the pages again.","accept":["A deep link to Transactions returns to Transactions after sign-in","After Sign Out the same link redirects to sign-in again"]}]},{"id":"DSH","title":"Dashboard","summary":"Counters, recent activity and shortcuts to start a workflow.","reqs":[{"id":"FR-DSH-01","weight":"Must","text":"The dashboard shows five counters (Drafts, Out for Signature, Completed, Declined, Voided) that equal the number of workflows in each status, plus recent activity.","accept":["A fresh session shows Drafts 1, Out for Signature 1, Completed 1, Declined 0, Voided 0","Recent activity lists \"Vendor agreement — Okafor\" (Draft), \"Beneficiary change — Tanaka\" (Out for Signature) and \"Brokerage onboarding — Rivera\" (Completed)","Clicking the Out for Signature counter opens Transactions filtered to that status"]},{"id":"FR-DSH-02","weight":"Should","text":"\"Start a workflow\" offers four types, each with a description; choosing one creates a draft and opens its setup.","accept":["Types: Send for Signature, Sign & Send, In-Person Signing, Sign Only","Choosing Send for Signature opens \"Workflow Setup WF-0004\" with one empty Signer row and the Drafts counter becomes 2"]}]},{"id":"WFL","title":"Workflows","summary":"List, create, edit lock and delete workflows.","reqs":[{"id":"FR-WFL-01","weight":"Should","text":"The Workflows table lists every workflow and supports text search, status filter and sorting by column.","accept":["A fresh session lists 3 rows; the draft offers Edit and Delete, the others View only","Searching \"tanaka\" leaves only \"Beneficiary change — Tanaka\"","A filter with no matches shows \"No workflows match your filters.\"","Clicking the Name header twice sorts ascending then descending and flips the arrow"]},{"id":"FR-WFL-02","weight":"Could","text":"\"+ New Workflow\" replaces itself with a type chooser \"What would you like to do?\" that can be closed; the Workflow Designer menu entry opens it directly.","accept":["The close (×) control restores the button","Workflow Designer > New Workflow opens the page with the chooser already open"]},{"id":"FR-WFL-03","weight":"Should","text":"Only drafts can be deleted, and only after confirmation.","accept":["Dialog \"Delete workflow?\" states the workflow and its task placements will be permanently removed","Cancel keeps the row; confirming removes it and lowers the Drafts counter"]},{"id":"FR-WFL-04","weight":"Must","text":"Workflows that are no longer drafts are locked: they cannot be edited or deleted in the UI or through the API.","accept":["Opening a sent workflow redirects to its transaction details","Editing a sent workflow returns 409 \"Workflow is Out for Signature; only drafts can be edited\"","Deleting one returns 409 \"Only drafts can be deleted — void the transaction instead\"","An unknown workflow returns 404 \"Workflow not found\""]},{"id":"FR-WFL-05","weight":"Could","text":"Sign & Send and Sign Only workflows start with the signed-in user as the first signer; unknown workflow types are rejected.","accept":["Sign Only: recipient 1 is the signed-in user with role Signer","Sign & Send: recipient 1 is the signed-in user followed by an empty recipient 2","Creating a workflow with an unknown type returns 422 \"type must be one of send, sign-send, in-person, self\""]}]},{"id":"REC","title":"Recipients","summary":"Who signs, in which order.","reqs":[{"id":"FR-REC-01","weight":"Should","text":"Recipients can be added, reordered, given a role and removed, and picking a known contact fills the email.","accept":["Choosing contact \"Mei Tanaka\" fills mei.tanaka@example.com","Moving recipient 2 up swaps the order and shows an \"Unsaved changes\" badge","Save shows \"Workflow saved.\" and the order survives a reload"]},{"id":"FR-REC-02","weight":"Could","text":"Saving a recipient with a malformed email is refused by the server and the draft stays unsaved.","accept":["Message \"Recipient 1: “not-an-email” is not a valid email address\""]}]},{"id":"DOC","title":"Document templates","summary":"Attach PDFs from a searchable template library.","reqs":[{"id":"FR-DOC-01","weight":"Must","text":"Choosing a template in the searchable dropdown attaches it; the document processes for about 3 seconds before it can be tagged.","accept":["Typing \"brokerage\" lists 5 options (BrokerageAccountApp, BrokerageAmendment, BrokerageAuthorization, BrokerageDisclosure, BrokerageWaiver, each .pdf)","Picking one shows \"Processing: <file>\", a Documents row with 4 pages and status Processing","Tag Document does nothing while Processing and opens the Tasks Editor once the status is Ready"]},{"id":"FR-DOC-02","weight":"Could","text":"The dropdown is keyboard operable and shows a no-results tip.","accept":["A search with no match shows \"No results found...\"","Typing, ArrowDown and Enter picks the highlighted option"]},{"id":"FR-DOC-03","weight":"Should","text":"A workflow holds at most 5 distinct documents; removing a document removes its tasks.","accept":["Attaching the same template twice alerts \"<file> is already attached\"","After 5 documents the dropdown is disabled; a 6th via the API returns 422 \"A workflow can hold at most 5 documents\"","An unknown template returns 422 \"templateId does not match a document template\""]}]},{"id":"TSK","title":"Tasks editor","summary":"Place and edit signing fields on rendered pages.","reqs":[{"id":"FR-TSK-01","weight":"Must","text":"Dragging a task type from the list onto a page places it where the pointer is released, in PDF points.","accept":["The editor shows 4 pages of 612×792 pt and 10 task types","A Signature marker is 180×36 and appears under the drop point; its Left / Top match the drop point, not the page centre","An announcement \"Signature placed on page 1 at (…) via drag-and-drop\" is made"]},{"id":"FR-TSK-02","weight":"Should","text":"Double-click or Enter on a task type places it centred on the page in view.","accept":["Initials (64×30) lands at Left / Top 274, 381 on page 1","Date Signed placed by keyboard lands at 251, 385"]},{"id":"FR-TSK-03","weight":"Should","text":"Placed markers can be moved, resized (minimum 12×12) and nudged with arrow keys, always staying within the page, and Save keeps their new position and size.","accept":["Moving right by 100 px at 100% zoom raises Left by about 100 and keeps Top","ArrowLeft stops at Left 0; dragging past the right edge clamps so Left + width ≤ 612","Save shows \"Saved 1 task(s)\" and a reload shows the position the marker had when saved"]},{"id":"FR-TSK-04","weight":"Should","text":"The task properties dialog validates numeric input against the page bounds.","accept":["Left 500 with width 180: \"The task must fit inside the page (612 × 792 pt).\"","Left \"abc\": \"left must be a number\"","Left 100, Top 600: \"Task updated\" and the marker moves"]},{"id":"FR-TSK-05","weight":"Could","text":"Zoom changes how large pages and markers are drawn but never their stored point coordinates.","accept":["Zooming to 150% leaves Left / Top unchanged","A task dropped at 150% is stored as screen offset ÷ 1.5","Fit width shows a non-preset percentage"]},{"id":"FR-TSK-06","weight":"Should","text":"The tasks API validates processing state, task type, page, bounds and recipient.","accept":["Still processing: 409 \"<file> is still processing\"","Unknown type: 422 \"Task 1 (Stamp): unknown task type. Allowed: Signature, Initials, Date Signed, Full Name, Email, Title, Company, Text, Checkbox, Attachment\"","Page 9: 422 \"Task 1 (Signature): page must be between 1 and 4\"","Out of bounds: 422 \"Task 1 (Signature): placement is outside the page (page is 612×792 pt)\"","Unknown recipient: 422 \"Task 1 (Signature): recipient 3 does not exist\"","A valid set is saved and echoed with 200"]}]},{"id":"SND","title":"Send for signature","summary":"Validation and launch of a workflow as a transaction.","reqs":[{"id":"FR-SND-01","weight":"Must","text":"Send now is refused while the workflow has problems, and every problem is listed at once.","accept":["An empty draft lists: Enter a workflow title; Recipient 1: full name is required; Recipient 1: a valid email is required; Recipient 1 has no Signature task; Add at least one document","With documents still processing the list includes \"Wait for documents to finish processing\"","A recipient without a Signature task shows \"<name> has no Signature task\""]},{"id":"FR-SND-02","weight":"Must","text":"A complete workflow launches a transaction with a signing link per signer, and cannot be launched twice.","accept":["Message \"Congratulations! You have successfully launched the Workflow to start your Transaction\" and \"Transaction TX-1003 is now out for signature.\"","Each signer gets an \"Open signing link\" to /esign/sign/<token>","The transaction drawer shows the signer Pending and audit entries Created and Sent","Sending again returns 409 \"Workflow already Out for Signature\""]}]},{"id":"SGN","title":"Signing ceremony","summary":"The signer’s consent, signature, field entry and finish.","reqs":[{"id":"FR-SGN-01","weight":"Must","text":"A signer opens the link, consents, adopts a signature, completes required fields and finishes; a finished link cannot be reused.","accept":["Intro shows the workflow title, \"From <sender> · for <name> (<role>)\" and \"<n> document(s), <m> field(s) for you to complete.\"; Continue is disabled until \"I agree to use electronic records and signatures.\" is ticked","Document view shows \"0 of 2 required\" rising to \"2 of 2 required\" as fields are completed; Date inserts today as M/D/YYYY","Finish shows \"All done!\" — \"All parties have signed. A completed copy will be emailed to everyone.\"","Reopening the link shows \"Signed\" — \"You have already signed this document.\""]},{"id":"FR-SGN-02","weight":"Should","text":"Finish is enabled only after the signer has scrolled to the end of the document.","accept":["Disabled Finish shows the hint and tooltip \"Scroll to the end of the document to enable Finish\"","At the end the hint reads \"Ready to finish\""]},{"id":"FR-SGN-03","weight":"Could","text":"\"Next ▸\" scrolls to the next unfilled required field and is disabled when none remain."},{"id":"FR-SGN-04","weight":"Should","text":"The Adopt Your Signature dialog supports select-style, draw and upload and validates each before adoption.","accept":["Empty pad: \"Draw your signature in the box.\"","Non-image upload: \"Upload a PNG, JPG, GIF or SVG image.\"","Image over 1 MB: \"The image must be smaller than 1 MB.\"","Empty name in select-style: \"Type your full name.\""]},{"id":"FR-SGN-05","weight":"Must","text":"The completion endpoint enforces consent, a signature, all required fields and single use, independent of the UI.","accept":["No consent: 422 \"You must agree to use electronic records and signatures\"","No signature: 422 \"Adopt a signature first (draw, type or upload)\"","Missing fields: 422 \"<n> required field(s) still need your input\" with the missing task ids","Empty drawn data: 422 \"The drawn signature is empty — draw your signature in the box\"","Success returns 200 with status Completed; repeating returns 409 \"You have already signed\"","An unknown token returns 404 \"This signing link is invalid or has expired\""]},{"id":"FR-SGN-06","weight":"Must","text":"Signers sign in routing order: a later signer sees a waiting page until earlier signers finish.","accept":["Early signer: \"Not your turn yet\" — \"Waiting for Mei Tanaka to sign first\"","After Mei finishes: \"Thank you, Mei Tanaka. The document has been routed to Ola Nordmann.\" and Ola can then open the ceremony","The transaction then shows Mei Signed with a time, Ola Pending, progress \"1 / 2 signed\""]},{"id":"FR-SGN-07","weight":"Should","text":"A signer can decline with a reason, which sets the transaction to Declined.","accept":["An empty reason shows \"Tell the sender why you are declining.\"","Confirmation \"Declined\" — \"You declined to sign. The sender has been notified.\"","The dashboard moves the workflow from Out for Signature to Declined"]}]},{"id":"TRX","title":"Transactions","summary":"Track and void sent workflows.","reqs":[{"id":"FR-TRX-01","weight":"Should","text":"Transactions lists every sent workflow (never drafts) with progress, searchable, and a details drawer with recipients, documents and audit trail.","accept":["A fresh session lists TX-1002 (0 / 2 signed, \"Mei Tanaka → Ola Nordmann\") and TX-1001 (Completed)","Searching \"nordmann\" leaves only TX-1002","The drawer shows an \"Open signing link\" with Copy (briefly \"Copied!\") only for the active signer; waiting signers have no link","Closing the drawer removes ?open from the address"]},{"id":"FR-TRX-02","weight":"Should","text":"Voiding a transaction needs a reason of at least 5 characters and invalidates its signing links; completed transactions cannot be voided.","accept":["A short reason: \"Give a reason of at least 5 characters.\"","Voided shows \"Voided: <reason>\" and no Void button","A voided signing link shows \"Transaction voided\" — \"This transaction was voided by the sender\"","Voiding a Completed workflow returns 409 \"Cannot void a Completed workflow\""]}]},{"id":"LAB","title":"Mouse Lab","summary":"A page of pointer, scroll, hover and drag exercises.","reqs":[{"id":"FR-LAB-01","weight":"Could","text":"Mouse Lab shows nine numbered sections and an event log; the \"I have read everything\" button is enabled only after its inner scroll area is scrolled to the bottom, and the infinite feed loads 20 envelopes at a time up to 200.","accept":["Reaching the end shows \"No more envelopes\""]},{"id":"FR-LAB-02","weight":"Could","text":"The kanban board (HTML5 drag) and the sortable list (pointer drag) apply moves and keep them for the session.","accept":["Dragging \"Verify ID\" to Done gives To do 2, Done 2","Dragging \"Alpha\" below \"Charlie\" shows \"Order: Bravo, Charlie, Alpha, Delta, Echo, Foxtrot\"","Both survive a reload and are returned by the lab state API"]},{"id":"FR-LAB-03","weight":"Could","text":"Free drag, long-press (1 s hold to confirm), single/double/middle/right clicks and inline rename are recognised and logged.","accept":["Dropping the box in the zone shows \"inside the drop zone ✔\"","Holding 1 s shows \"Confirmed ✔\"; releasing early resets the fill","Right click opens no browser context menu"]},{"id":"FR-LAB-04","weight":"Could","text":"Hover-only controls, canvas pointer tracking, the movable dialog and Ctrl+wheel zoom work.","accept":["Hovering \"@jordan.rivera\" shows a card \"Jordan Rivera — Account owner · 4 envelopes\"","Row actions Edit and Archive appear only on the hovered row","Canvas shows \"x … · y …\" and \"Pointer outside\" when left","Ctrl+wheel changes zoom; Reset returns 100%"]}]}],"nfr":[{"id":"NFR-01","weight":"Must","text":"Each browser session sees its own copy of the data; workflows created in one session are invisible to another.","accept":["A second session sees only the 3 seeded workflows and Drafts 1","Opening another session’s workflow shows \"This workflow does not exist (or belongs to another session).\""]},{"id":"NFR-02","weight":"Could","text":"On a 375 px wide viewport the navigation collapses behind a \"Toggle navigation\" button, closes after navigating, and tables stack their rows with labels."}],"glossary":[{"term":"Workflow","meaning":"A draft package of recipients, documents and placed tasks; becomes a transaction when sent."},{"term":"Transaction","meaning":"A sent workflow with per-recipient progress and an audit trail."},{"term":"Task","meaning":"A field placed on a page (Signature, Initials, Date Signed, Full Name, Email, Title, Company, Text, Checkbox, Attachment)."},{"term":"Point","meaning":"PDF unit; pages are 612×792 pt and stored coordinates are in points regardless of zoom."}],"outOfScope":["Real PDF rendering (pages are generated images)","Email delivery","Legal validity of signatures","The Document Templates menu (coming soon)"]}