{"id":92905,"plugin_id":"plugin_asdk_app_6ae1f7b461848191ad8ac74368c0b88f","kind":"skill","collection_source":"plugin_package","comparison_source":null,"observed_at":"2026-11-12T12:10:05.518Z","digest":"e0a4e91724d0ca1a7da6bdf91f97b2cd54979fdae15badd417c101886dc4efcd","against":null,"payload":{"description":"Send a contract or document for e-signature through Formify. Use when sending something to be signed, from a saved template, an uploaded PDF, or a document drafted in this conversation. Triggers on \"send for signature\", \"send this contract\", \"e-sign\", \"signing request\", \"skicka för signering\", \"skicka kontrakt\", \"enviar para firmar\". Not for a reusable link anyone can sign (formify-share-link) or checking who signed (formify-track-signatures).","included_files":[{"relative_path":"agents/openai.yaml","size_in_bytes":509},{"relative_path":"references/signature-placement.md","size_in_bytes":4084}],"name":"formify-send-contract","skill_md_contents":"---\r\nname: formify-send-contract\r\ndescription: 'Send a contract or document for e-signature through Formify. Use when sending something to be signed, from a saved template, an uploaded PDF, or a document drafted in this conversation. Triggers on \"send for signature\", \"send this contract\", \"e-sign\", \"signing request\", \"skicka för signering\", \"skicka kontrakt\", \"enviar para firmar\". Not for a reusable link anyone can sign (formify-share-link) or checking who signed (formify-track-signatures).'\r\nlicense: MIT\r\nmetadata:\r\n  version: \"1.6.1\"\r\n---\r\n\r\n# Send a document for signature\r\n\r\nVersion 1.6.1. If asked which version you are, quote this line.\r\n\r\n## Purpose\r\n\r\nTake a document — a saved Formify template, a PDF the user has, or one drafted here — place\r\nthe signature fields, let the user check the result, and send it to the people who must sign.\r\n\r\n## When this applies\r\n\r\n- Sending anything for signature, from any of those three starting points.\r\n- Collecting signers, choosing how the invitation reaches them, choosing how they sign.\r\n- Previewing where a signature will land before anyone is contacted.\r\n\r\n## When it does not\r\n\r\n- **Building or editing the PDF itself** → `formify-pdf-forms`.\r\n- **Choosing an identity check** → `formify-verify-identity` decides *what* verification is\r\n  needed; this skill configures it on the signer.\r\n- **Anything after the send** → `formify-track-signatures`.\r\n- **One reusable link that anyone may open and sign** → `formify-share-link`. This skill\r\n  invites named people to one document. That one publishes a link with no recipients, and\r\n  produces a separate document per signer. If the user cannot name who will sign, they want\r\n  the other skill.\r\n\r\n## Preconditions\r\n\r\nA connected Formify account.\r\n\r\n**Call `get_account_capabilities` first, every time.** It decides which delivery channels and\r\nwhich signing methods you may offer. Offering a feature the account does not have wastes the\r\nuser's time and is the fastest way to lose their trust.\r\n\r\n## Procedure\r\n\r\n### 1. Announce what is possible, then take one starting point\r\n\r\nBefore asking anything:\r\n\r\n> I can send a document for signature. We can use one of your saved templates, a PDF you\r\n> upload, or I can draft one here first. Signers can sign by hand, or with BankID, an ID\r\n> scan or a face check if your plan includes them. I can also send an AI assistant along\r\n> inside the document, so the recipient can ask it questions instead of asking you.\r\n>\r\n> Which would you like to start from?\r\n\r\nOne question at a time from here on. Never present a form of six questions.\r\n\r\n### 2. Get the document in place\r\n\r\n**From a template.** List templates and let the user pick by name — never show IDs. Read the\r\ntemplate and its fields. A template carries its own signer count and its own pre-configured\r\nsignature settings; **do not override them unless the user explicitly asks.** If the user\r\nwants a different number of signers than the template defines, it is possible, but warn that\r\nsignature placement may be wrong.\r\n\r\n**From a PDF.** The file must not be password-protected, and must not already carry a\r\ndigital signature from another service. Check before uploading; neither can be removed here.\r\n\r\nFour upload routes, **exactly one per upload** — a host file reference, a URL, a staged\r\nupload id, or the bytes. Try them in this order and say which one you used:\r\n\r\n1. **A file reference the host supplied**, when the user attached the file and this\r\n   environment passes attachments through to tools. Pass it exactly as given; the server\r\n   fetches the bytes itself. Never build one by hand and never put a local path in it.\r\n   If the user did attach a file but no reference arrived, retry the call once before\r\n   falling to another route — the reference sometimes lands on the second attempt.\r\n2. **A public HTTPS URL** — works in every environment. Prefer it whenever a URL exists.\r\n3. **A staged upload**, when shell commands are available: request the upload URL, run the\r\n   returned command, and wait for it to return success **before** registering the file.\r\n   The upload goes to the host named in the returned URL — normally the Formify MCP host —\r\n   not to the document API host.\r\n   **Only one staged upload may be pending per user.** A new request is refused while\r\n   another upload is pending; it does not replace the earlier upload. Follow the returned\r\n   pending-upload instructions: finish the upload command if needed, wait for HTTP 200,\r\n   then consume it with `upload_file` before requesting the next URL. Do not switch to\r\n   base64 merely because another staged upload is pending.\r\n4. **Base64**, when the complete untruncated bytes are available here. This is supported.\r\n   It needs the filename alongside it. **Verify the bytes are complete before sending them.**\r\n   Assistants routinely truncate long strings, and a truncated base64 payload uploads a\r\n   corrupt PDF that fails silently rather than erroring — prefer an earlier route whenever\r\n   one is available. The practical ceiling is small: base64 is a third larger than the file,\r\n   so anything past roughly 30–50 kB of PDF exceeds what can be emitted in one message.\r\n\r\nThe ceiling is 50 MB per file.\r\n\r\nIf one route fails, say which and offer another. Do not retry the same one.\r\n\r\n**Several documents into one.** Two to eight uploaded PDFs can be merged into a single file\r\nfor signing. The order given is the page order. The originals are kept, so a merge is safe\r\nto redo.\r\n\r\n**Drafted here.** Build it with `formify-pdf-forms`, then continue from route 3 or 4.\r\n\r\n**From something already sent.** A document that went out before can be copied — its file,\r\nsignature fields, signers, language, sharing and AI assistant come with it. The copy arrives\r\nas a **draft, and nothing is sent**: that is deliberate, because re-sending a contract to the\r\nsame people on one click is almost never what was meant. Review it, adjust, then send. A draft\r\ncan be copied the same way, which is the cheapest way to build several similar documents from\r\none prepared starting point. Neither copy costs anything; the signature charge happens on the\r\nsend, as always. Signature progress is never copied — every field in a copy starts unsigned.\r\nAny payment requirement on the source **is** carried over, so check it before sending.\r\n\r\n### 3. Discover the fields, and offer to pre-fill\r\n\r\nAlways read the document's fields after loading it. Filter to the editable ones; skip\r\nread-only fields entirely.\r\n\r\nIf there are editable fields, ask the one question that matters:\r\n\r\n> Shall I fill these in now, or leave them for the signer?\r\n\r\nA value you fill is locked for the signer. Blanks are left for them.\r\n\r\n**Locking is not automatic — you have to ask for it.** The read-only mode for fields defaults\r\nto keeping whatever the original PDF had, which leaves your pre-filled values editable. Set the\r\nmode to the one that locks filled fields **whenever you supply any field value**; otherwise a\r\nsigner can quietly change the price you just wrote. The third mode, which locks every field\r\nincluding the blanks, is for a document nobody is meant to complete.\r\n\r\n**Use the exact field names the API returned.** Never construct or guess one.\r\n\r\n**Value format — two rules, and breaking either fails the send:**\r\n\r\n- Only single-line text and radio buttons take a plain string. **Checkboxes, dropdowns and\r\n  list boxes must be an array, even for one value.**\r\n- Never send an empty string. Omit the field instead.\r\n\r\n**Identity-document copies — explicit confirmation.** The signature method\r\n`digital_ink_id_scan` embeds an image of the front of the signer's identity document\r\nin the signed PDF. Form fields containing a `tink-scan-id` trigger or a\r\n`tink-scanned-id-` image attribute can also embed an identity-document image; a\r\ntrigger combined with a `tink-scanned-id-mrz-` attribute on the same field instead\r\nfills that field with text. Inspect the actual signature settings and field names.\r\nBefore `create_document`, `send_draft`, `create_link`, or `duplicate_link` creates\r\na live workflow containing an identity-document image, explain that the image will\r\nremain in the signed PDF, ask whether the sender has a legal basis for retaining\r\nit and wants to proceed, and wait for an explicit yes. Include this in the final\r\nconfirmation summary. Template defaults and copied settings do not waive this\r\ncheck. Offer MRZ text fields or another signing method when an image is not needed;\r\ndo not change the chosen method silently. The signer performs the verification\r\non Formify's signing page; this skill configures that workflow and must not ask\r\nthe user to supply an identity-document image or a biometric recording in chat.\r\n\r\n### 4. Collect the signers\r\n\r\nEach signer needs a full name and **at least one** of an email address or a phone number.\r\nBoth is fine.\r\n\r\n**A phone number alone is enough.** Do not insist on an email. A signer reachable only on\r\nWhatsApp is a normal case, not an edge case, and refusing it turns away business the\r\nplatform supports.\r\n\r\nDelivery channel, gated on capabilities: email is always available; SMS needs `deliverySms`;\r\nWhatsApp needs `deliveryWhatsapp`.\r\n\r\n**A document takes at most 18 signees.** A larger signing — a board resolution, a residents'\r\nassociation — is several documents, and it is better to say so while collecting names than to\r\nfail at the send.\r\n\r\nA personal message may run to 500 characters, but **keep it under about 250 for SMS and\r\nWhatsApp**, where the rest is what gets cut off on the recipient's phone.\r\n\r\nIf the user wants to distribute the links themselves rather than have Formify invite anyone,\r\nsuppress the invitation when creating the document, then hand over the personal links with\r\n`formify-track-signatures`. Suppression covers **invitations only** — including the\r\ninvitation each person gets when their turn comes in a signing order. Reminders and the\r\ncompleted-document email still go out.\r\n\r\nSigning order — who must sign first — is available when the account has `signingOrder`.\r\n\r\n**One document, or one each? Ask — do not assume.**\r\n\r\n`create_document` creates **one** document and places every entry of `signeeDetails` on it.\r\nThose people sign the same copy, appear to one another, and all receive the completed\r\ndocument. That is right for a contract between parties and wrong for the same text sent to\r\nunrelated people.\r\n\r\n| The user says | What they mean | What to build |\r\n|---|---|---|\r\n| \"Send it to both tenants\" | One agreement, two parties to it | One document, two signees |\r\n| \"Send this NDA to the three freelancers\" | Three separate agreements | Three documents, one signee each |\r\n\r\nThe test is disclosure: **would it be wrong for these signers to see each other's names and\r\nreceive each other's signed copy?** If yes, they are separate documents, not one document\r\nwith several signees.\r\n\r\nFor separate documents, choose the template or upload the file once, then call\r\n`create_document` once per person with a single-entry `signeeDetails`. Give each one a name\r\nthat identifies the recipient — `NDA — Maria Alvarez`, not three documents called `NDA` —\r\nbecause that name is what `list_documents` returns and what the user reads when they ask who\r\nhas signed. Identical names make tracking useless.\r\n\r\nThe tool interface does not state whether one `fileId` may back several documents. Reuse it,\r\nand if a later call rejects it, upload the file again for that person.\r\n\r\nCount out loud before creating anything: *\"That is three separate NDAs, so three invitations\r\ngo out.\"* Each one is a real message to a real person and none of them can be recalled.\r\n\r\n### 5. Choose how each signer signs\r\n\r\nFour methods, each gated. Ask only if the account has more than the default and the template\r\ndoes not already decide it.\r\n\r\n| Method | Requires |\r\n|---|---|\r\n| Handwritten signature | always available |\r\n| BankID | `signatureBankId` |\r\n| ID scan then signature | `signatureIdScan` |\r\n| Face check | `signatureFaceLiveness` |\r\n\r\n**ID-scan signing needs two boxes placed, not one:** the signature box *and* a separate\r\nID-scan box. Configuring only the signature box is the most common cause of a failed send in\r\nthis area. See `references/signature-placement.md`.\r\n\r\nMethods are per signer. Different people on one document can use different methods.\r\n\r\n### 6. Place the signature\r\n\r\nAsk where it goes: a new page at the end — the default and the safe choice — or a specific\r\nposition on an existing page.\r\n\r\nFor an existing page you need page, x and y.\r\n\r\n- **Pages are numbered from zero.** The first page is `0`. Getting this wrong puts the\r\n  signature on the wrong page, and the document still sends.\r\n- Origin is the **top-left** corner. x increases right, y increases **down**. (x, y) is the\r\n  top-left corner of the field.\r\n- A standard signature field is **219 × 58 points**.\r\n- **Coordinates must be whole numbers.** A decimal is not rounded — it is discarded, and\r\n  `74.7` is stored as `0`, putting the field in the corner of the page. Round before sending.\r\n- Check the actual page size. A4 is 595 × 842 points; US Letter is 612 × 792. Do not assume.\r\n\r\nBottom-right on A4: x = 595 − 219 = 376, y = 842 − 58 = 784, page = 0.\r\n\r\n**Formify does not detect overlapping fields, and a field is fully opaque.** Anything behind\r\nit is hidden, and nothing warns you. Never place a field over text the signer needs to read.\r\nWhere space is tight, shrink the field with a scale factor between 0.25 and 1.5 rather than\r\nmoving it onto the text.\r\n\r\n### 7. Preview before sending — always offer it\r\n\r\nThis is the step that catches a misplaced field, and it is the one the user actually cares\r\nabout.\r\n\r\nCreate a draft with exactly the configuration you would have sent, then show the rendered\r\nPDF. Two ways to present it; pick by what this environment can do:\r\n\r\n- **Inline**, if PDFs can be displayed here.\r\n- **A one-time link** the user opens in a browser. It needs no login, expires in ten minutes\r\n  and is consumed once used.\r\n\r\nIf neither works, say so plainly and offer to send without a preview — but say what is being\r\nskipped.\r\n\r\n**Check what came back before showing it.** This is the most common bug in this flow, and it\r\nis invisible: the user confirms a document that is not the one being sent.\r\n\r\n- The file must begin with the bytes `%PDF`. An expired or blocked link returns an HTML error\r\n  page, which saves happily under a `.pdf` name.\r\n- It must be larger than about a kilobyte. A near-empty file is a failed download.\r\n- Give the preview its own filename, distinct from the uploaded source — something like\r\n  `<title>-formify-preview.pdf`. Showing the source PDF back instead of the rendered draft\r\n  produces a confident \"looks right\" about a document whose signature boxes are elsewhere.\r\n\r\n**A preview link is spent once.** After any update to the draft, the previous link no longer\r\nworks: fetch a new one before showing the document again.\r\n\r\n**A field with no valid coordinates does not appear in the preview, but is still in the\r\ndraft.** So an incompletely placed signature field is invisible in exactly the step meant to\r\ncatch it. If a field you configured is missing from the rendered page, do not assume it was\r\ndropped — check its page, x and y before re-adding it.\r\n\r\n### The user does not have to send\r\n\r\nWhen the preview comes back, the honest menu has more than two entries. Offer what is\r\nactually reachable: send it now, **save it as a draft and stop**, move a signature, change the\r\nsigners, regenerate the document, or discard it.\r\n\r\n\"Save as draft\" is a real product state, not a soft no — the draft survives, and the user\r\nkeeps its identifier to come back to. Do not send it, and do not delete it. A user who says\r\n\"not now\" has chosen that state, and modelling it as \"discard\" throws away their work.\r\n\r\nThree things about drafts worth knowing:\r\n\r\n- **A draft starts from exactly one source: an uploaded file or a template.** Supplying both,\r\n  or neither, is an error. Starting from a template is how you preview one before anyone is\r\n  contacted — its document and signature fields are copied into the draft, you check or adjust\r\n  them, then send. The template itself is never touched.\r\n- **Updating a draft replaces its configuration.** Always read the draft first, and send\r\n  back everything you want to keep — not only the signers, but the field values, name,\r\n  invitation language, personal message, AI assistant, sharing settings and signing order. Anything\r\n  omitted can be reset. This read is required before updating, sending or deleting a draft,\r\n  including when resuming one from an earlier session.\r\n- Fields without valid coordinates do not appear in the preview but remain in the draft.\r\n  **A field missing from the preview is a real warning**, not a rendering quirk — and a\r\n  preview that looks right is not proof that every box is configured.\r\n\r\n### 8. Confirm, then send\r\n\r\nShow a compact summary — document name, each signer with their contact and signing method,\r\ndelivery channel, invitation language — and ask for one explicit yes.\r\n\r\nThree settings to establish before that:\r\n\r\n- **Invitation language: English, Swedish or Spanish only.** This is a closed list. If the\r\n  user wants the invitation in another language, say the invitation cannot be, and offer to\r\n  write the document itself in their language instead — those are separate things.\r\n- **A personal message** is optional, up to 500 characters.\r\n- **The in-document AI assistant**, if `get_account_capabilities` reports `aiAssistant`.\r\n  Ask only when the capability is present; never offer it otherwise. It travels with the\r\n  document and answers the recipient's questions about it, highlighting the passage it is\r\n  answering about, so they do not have to ask the sender or paste the contract elsewhere.\r\n\r\n  Three settings, and **it is off unless you switch it on**: whether it is enabled at all,\r\n  whether it reads its answers aloud (off unless asked — worth offering to anyone signing on\r\n  a phone, or to a signer who finds long documents hard to read), and the language it speaks.\r\n\r\n  **The assistant's language is not the invitation's.** The invitation is a closed list of\r\n  three; the assistant takes any language and simply defaults to English if you say nothing.\r\n  So a Croatian, Dutch or German signer can be talked through the contract in their own\r\n  language even though their invitation email cannot be written in it. Set it deliberately —\r\n  the default is English, not the signer's language and not the document's.\r\n\r\n  Say what it does when offering it. Users do not know this exists, and it is the single\r\n  capability most likely to save the sender a week of email.\r\n\r\nSend only after the yes.\r\n\r\n### 9. Hand back the result, and say what comes next\r\n\r\nGive the tracking link, then close the loop:\r\n\r\n> It's on its way to Maria and Johan. I can check who has signed, send a reminder, or fetch\r\n> the signed copy whenever you need — just ask.\r\n\r\nThat sentence is what makes the follow-up work discoverable. Without it the user assumes the\r\njob ended at the send.\r\n\r\n## Failure modes\r\n\r\n| What you see | What it means | What to do |\r\n|---|---|---|\r\n| Upload command blocked by network or allowlist | The environment blocks outbound requests to the upload host | Do not retry. Name the wall **and the door** — see below. Then use the URL route or base64. |\r\n| The allowlist already says \"All domains\" and the upload is still blocked | A known regression in Claude Code cloud and the Cowork VM (anthropics/claude-code #93562, open since 2026-09-11): the setting is not honoured there | Do not send the user back to the setting. Take the URL route or base64 in the same turn. |\r\n| A preview downloaded, but does not open | An HTML error page was saved under a `.pdf` name | Check for the `%PDF` header before showing anything. Fetch a fresh link and retry once. |\r\n| The preview link stopped working | It was consumed, or the draft was updated | Request a new one. Links are single-use and expire in ten minutes. |\r\n| More than 18 signers rejected | A document takes at most 18 signees | Split the signing across several documents. |\r\n| Send rejected, 400 on fields | A checkbox, dropdown or list box was sent as a string, or a field was sent as `\"\"` | Wrap in an array; omit empty values. |\r\n| Signature landed in the corner of the page | A decimal coordinate was discarded | Send whole numbers. |\r\n| Signature covers the text | The field is opaque | Move it to clear space. Where there is none, shrink it with a scale factor between 0.25 and 1.5 — never leave it overlapping. |\r\n| ID-scan send fails | The ID-scan box was not placed | Both boxes are required for that method. |\r\n| Signers vanished after an update | The draft update replaced the configuration | Read the draft, resend the complete signer list. |\r\n| Draft creation rejected | Both a file and a template were supplied, or neither | A draft takes exactly one source. Send one. |\r\n| An invitation language was refused | Only English, Swedish and Spanish exist | Offer the document in their language instead. |\r\n| The account lacks a channel or method | Capability off | Name it, say what it does, offer the best available alternative. |\r\n\r\n### When the environment blocks the upload, name the door\r\n\r\nA sandbox that refuses outbound requests is the single most likely hard stop a first-time user\r\nhits, and it kills both halves of this flow — the staged upload on the way in, the preview\r\ndownload on the way out. Telling them \"something blocked it\" leaves a non-technical person\r\nwith nowhere to go.\r\n\r\nSay instead, in their language, that this assistant is not yet allowed to reach Formify's\r\ndocument host, and that they can allow it themselves in the app's settings: the code-execution\r\nor connector settings carry a **domain allowlist**, and either adding the document host shown\r\nin the error or choosing the \"all domains\" option opens it. The host is entered as a bare\r\nhostname — no `https://`, no path, no trailing slash. After saving, the send can be retried\r\nfrom where it stopped; nothing already done is lost.\r\n\r\nIf the user says the allowlist is already on \"all domains\" and the wall is still there, believe\r\nthem: on Claude Code cloud and in the Cowork VM that setting is currently ignored (a regression\r\nreported 2026-09-11). Go to the URL route or base64 without another round trip.\r\n\r\nOffer the URL route in the same breath, because it needs no allowlist at all. Never paste the\r\nraw document-host download URL as a clickable link — it is machinery, not something a user\r\nshould be asked to click.\r\n\r\n## References\r\n\r\n- **`references/signature-placement.md`** — box dimensions, the coordinate system, page-size\r\n  arithmetic, ID-scan box placement and multi-signer stacking. Open it whenever a signature\r\n  goes somewhere other than a new page at the end.\r\n"},"changes":[],"summary":"First saved snapshot. No earlier version is available for comparison.","summary_kind":"deterministic","summary_metadata":{}}