How to upload a rendered credit memo PDF to nCino DocMan via the Document Manager Placeholder API. Use whenever the agent needs to write a memo (or any other document) back to a borrower's record in nCino, save to DocMan, save to the deal record, save to the loan record, or upload to a Product Package. Trigger on phrases like "save to nCino", "upload to DocMan", "save to the deal", "save the memo", "write back to nCino", or any request to register a document in the bank's system of record after the agent has produced it.
How this skill is triggered — by the user, by Claude, or both
Slash command
/truist-credit-memo-agent:ncino-docmanThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
How to save a generated document (typically a credit memo PDF) to nCino DocMan as a proper **placeholder** — not as a generic Salesforce File. This is the system-of-record write path that the credit committee expects.
How to save a generated document (typically a credit memo PDF) to nCino DocMan as a proper placeholder — not as a generic Salesforce File. This is the system-of-record write path that the credit committee expects.
Basic ContentVersion + ContentDocumentLink only attaches the file to a record. It puts the document in the "Files" related list but does NOT register it in nCino's DocMan view. DocMan is a layer on top of Salesforce Files with its own placeholder model, audit history, and category taxonomy. Credit committee reviewers go to the DocMan tab — files in the generic Files list are invisible to them.
The Placeholder API at /services/apexrest/NDOC/api/v1/document-management/placeholders/* is the correct write path. It both registers the placeholder in DocMan AND wires up the underlying ContentVersion. Use it.
Demo assumption: the PDF is already rendered. This skill does NOT handle HTML→PDF rendering — that's environmental (Chrome headless on macOS, weasyprint in a properly-provisioned Cowork sandbox, hosted service, etc.). Render upstream; this skill picks up the PDF and pushes it into nCino.
For this demo, the Salesforce instance URL is hardcoded to the Accenture BankingGPT sandbox (per CLAUDE.md):
https://accenture-d8--bankinggpt.sandbox.lightning.force.com
Use this literal base for every API call and every Lightning record link. Do NOT call getUserInfo, do NOT ask the user for an instance URL.
URL pattern for all Lightning record links:
https://accenture-d8--bankinggpt.sandbox.lightning.force.com/lightning/r/{ObjectApiName}/{RecordId}/view
(In production, this gets swapped back to env/connector resolution.)
POST {instanceUrl}/services/data/v60.0/sobjects/ContentVersion
Authorization: Bearer {accessToken}
Content-Type: application/json
{
"Title": "{Borrower} - Commercial Credit Memo - {YYYY-MM-DD}",
"PathOnClient": "{borrower-slug}-credit-memo-{YYYY-MM-DD}.pdf",
"VersionData": "{base64-encoded PDF bytes}"
}
Capture Id from response (starts with 068...) — that's the ContentVersion Id you'll need for Step 3.
Notes:
FirstPublishLocationId here. If you set it, Salesforce auto-creates a ContentDocumentLink to that record, dropping the file into the generic "Files" related list. That's the WRONG path for DocMan. Leave FirstPublishLocationId out — Step 3's placeholders/create call wires up the linkage correctly.VersionData must be base64-encoded. Read the file binary, base64-encode, embed in the JSON string.Each Doc Type record (LLC_BI__DocType__c) is scoped to a specific Document Manager (LLC_BI__DocManager__c), which is in turn scoped to a parent object type (LLC_BI__Type__c, e.g., LLC_BI__Product_Package__c).
To find available Doc Types on a Product Package's DocMan:
SELECT Id, Name
FROM LLC_BI__DocType__c
WHERE LLC_BI__DocManager__r.LLC_BI__Type__c = 'LLC_BI__Product_Package__c'
ORDER BY Name
For Loan-level DocMan, change the filter to 'LLC_BI__Loan__c'.
In the BankingGPT (Truist) sandbox specifically — important field-tested convention:
The Product Package "DocMan" tab aggregates loan-level placeholders, not package-level ones. The page renders placeholders whose context is a child LOAN of the package (using the Loan DocManager a3kbb000000aLZ4AAM or the Collateral DocManager a3kbb000000aLZ5AAM). Placeholders attached directly to the Product Package context (using the Product Package DocManager a3kbb000000aLYzAAM) do NOT appear in this view, even though they technically exist on the package record.
Practical implication for credit memo uploads in this org: attach the placeholder to the primary loan (typically the largest by commitment, or the one designated as primary), NOT the Product Package itself. Use the Loan-level "Underwriting" DocType (a3nbb000004uyDxAAI) as the category — that's purpose-built for credit memos.
Available Loan-level DocTypes in this org:
a3nbb000004uyE4AAI)a3nbb000004uyDyAAI)a3nbb000004uyDlAAI)a3nbb000004uyE5AAI)a3nbb000004uyDwAAI)a3nbb000004uyDxAAI) ← use this for credit memosAvailable Product Package-level DocTypes (only used if you've confirmed the org renders package-level placeholders in its DocMan view):
a3nbb000004uyDjAAI)a3nbb000004uyDnAAI)In a different org / deployment, the available Doc Types AND the DocMan rendering convention may differ. Always query Doc Types first, and verify which level (Package vs. Loan) the org's DocMan view actually surfaces. Cache the result for the session.
The contextIdentity is the PRIMARY LOAN (in BankingGPT — Working Capital line a4Zbb000001vavpEAA is the primary for Piedmont), NOT the Product Package. The DocMan UI renders loan-level placeholders.
POST {instanceUrl}/services/apexrest/NDOC/api/v1/document-management/placeholders/create
Authorization: Bearer {accessToken}
Content-Type: application/json
{
"addNewVersion": true,
"placeholders": [
{
"attributes": {
"Name": "Credit Memo",
"category": "{Loan-level Underwriting DocType Id}",
"contextIdentity": "{Primary Loan Id}"
},
"document": {
"versions": [
{
"attributes": {
"internalContent": "{ContentVersion Id from Step 1}"
}
}
]
}
}
]
}
Expected response: HTTP 201 with a single placeholder descriptor. Capture identity (the placeholder ID, starts with a3s...).
The Name field is the display name in the DocMan UI — keep it short and semantic ("Credit Memo", "Annual Review Memo"). Do NOT include date or memo type in the Name — those belong on the ContentVersion.Title instead so the placeholder stays clean across refreshes.
The placeholder lives on the primary Loan but appears in the Product Package DocMan tab (because that tab aggregates loan-level placeholders). The user-facing language should match how they'll actually navigate to it — link to the Product Package DocMan tab, even though contextIdentity is the Loan.
Return:
Example:
Saved
piedmont-precision-credit-memo-2026-05-11.pdfas a new "Credit Memo" placeholder under primary Loan Piedmont Precision Working Capital Line (a4Zbb000001vavpEAA), visible on Product Package Piedmont Precision C&I Credit Package's DocMan tab. ContentVersion068bb00000KLwTjAAL, placeholdera3sbb00000R6yTRAAZ. View at https://accenture-d8--bankinggpt.sandbox.lightning.force.com/lightning/r/LLC_BI__Product_Package__c/{packageId}/view.
If the user has already saved a Credit Memo placeholder for this borrower's primary Loan (e.g., from a prior annual review), don't create a duplicate. Search first, update if found.
Search by the primary Loan Id — that's the contextIdentity placeholders live under in this org, not the Product Package Id.
POST {instanceUrl}/services/apexrest/NDOC/api/v1/document-management/placeholders/search
{
"contextIds": ["{Primary Loan Id}"],
"loadWithDocuments": false,
"loadWithDocumentVersions": false,
"paginationPageNumber": 0,
"resultsPerPage": 0
}
Iterate the response array, find any placeholder where attributes.Name is "Credit Memo" (case-insensitive). Capture its identity. If you search by Product Package Id you'll get back zero results (because placeholders aren't attached at that level in this org) and the refresh path will silently create a duplicate.
POST {instanceUrl}/services/apexrest/NDOC/api/v1/document-management/placeholders/update
{
"addNewVersion": true,
"placeholders": [
{
"identity": "{Existing Placeholder Id}",
"document": {
"versions": [
{
"attributes": {
"internalContent": "{ContentVersion Id from Step 1}"
}
}
]
}
}
]
}
addNewVersion: true keeps prior memo versions in the placeholder's history — important for audit trail.
When emitting Salesforce record references in memo output, email drafts, or chat responses:
Link with hyperlinks (using the {instanceUrl}/lightning/r/{ObjectApiName}/{Id}/view pattern):
AccountLLC_BI__Product_Package__cLLC_BI__Loan__c records under that PackageCite by ID inline, NO URL:
ContentDocument, ContentVersion, ContentDocumentLinkBoom_File__c, Boom_Financial_Statement__c, Boom_Line_Item__cLLC_BI__Account_Covenant__c, LLC_BI__Loan_Collateral2__c, LLC_BI__Legal_Entities__cReasoning: files attach to the Account / Product Package / Loan record and are accessed from there via the related lists or DocMan tab. Linking the underlying ContentVersion or junction object takes the user to a generic Salesforce detail page that doesn't fit the credit-officer workflow. Citing the ID inline (e.g., "Boom file a8Qbb0000003d85EAA") gives full traceability for audit / Exhibit D without sending the reviewer down the wrong navigation path.
Example output:
Saved as a new "Credit Memo" placeholder under primary Loan Piedmont Precision Working Capital Line, visible on Product Package Piedmont Precision C&I Credit Package's DocMan tab. Underlying ContentVersion
068bb00000KLwTjAAL, DocMan placeholdera3sbb00000R6yTRAAZ. Sourced from Boom filea8Qbb0000003d85EAA(FYE 12/31/2025).
FirstPublishLocationId in Step 1 — the file ends up in the generic Files related list instead of DocMan. The placeholder in Step 3 still works but you've duplicated the file linkage. Always omit FirstPublishLocationId when using the Placeholder API.instanceUrl.category ID returns HTTP 400. Cache the result of Step 2 for the session and reuse.contextIdentity, paired with the loan-level "Underwriting" DocType a3nbb000004uyDxAAI. (See Step 2 for the practical implication and the field-tested rationale.)+ and / characters. Use the language's standard base64 encoder.| Step | Method | Endpoint |
|---|---|---|
| 1. Upload PDF | POST | /services/data/v60.0/sobjects/ContentVersion |
| 2. Query DocTypes | GET | /services/data/v60.0/query/?q=SELECT... |
| 2a. Search existing placeholders | POST | /services/apexrest/NDOC/api/v1/document-management/placeholders/search |
| 3. Create placeholder + link | POST | /services/apexrest/NDOC/api/v1/document-management/placeholders/create |
| 3a. Update existing placeholder | POST | /services/apexrest/NDOC/api/v1/document-management/placeholders/update |
npx claudepluginhub kwaw-danflo/test-plugin --plugin truist-credit-memo-agentProvides UI/UX resources: 50+ styles, color palettes, font pairings, guidelines, charts for web/mobile across React, Next.js, Vue, Svelte, Tailwind, React Native, Flutter. Aids planning, building, reviewing interfaces.
Searches MemPalace before answering questions about past work, people, projects, or prior decisions. Returns verbatim stored content instead of guessing from model memory.