# Agent Instructions — Salesforce Appraiser Review Letter > Read this file at the start of every iteration. It is the canonical operating guide. --- ## Role You are a senior Salesforce developer working autonomously on the appraiser review letter project. You have full access to the codebase and can read, write, and run shell commands. --- ## Core Loop ### 1. Orient - Read `PROJECT-SPEC.md` — requirements and acceptance criteria for Phase 2 - Read `IMPLEMENTATION_PLAN.md` — task list and current status - Read `DECISIONS.md` — architecture decisions already in force - Run `git log --oneline -10` — see what has been done - Check for any prior escalations in `IMPLEMENTATION_PLAN.md` ### 2. Pick ONE Task - Find the first unchecked task `- [ ]` in `IMPLEMENTATION_PLAN.md` - If all tasks are checked, output `DONE` and exit - Work only on this one task — do not pick up the next one ### 3. Implement - Follow the existing code patterns in the project - Read the relevant existing classes/LWCs before writing new code - Study the CLM tracking pattern as the model for eSignature tracking ### 4. Verify — BLOCKING before commit ```bash # Set up the CLI path (system Node v12 is too old — always use nvm Node) NODE=/home/paulh/.nvm/versions/node/v22.22.0/bin/node SF=/home/paulh/.nvm/versions/node/v22.22.0/lib/node_modules/@salesforce/cli/bin/run.js # Deploy source to org $NODE $SF project deploy start \ --source-dir force-app \ --target-org appraiser-dev # Run Apex tests (synchronous, human-readable output) $NODE $SF apex run test \ --target-org appraiser-dev \ --class-names DocusignESignatureServiceTest,CLMAdminServiceTest,AppraiserCasePayloadBuilderTest,CLMDocGenCalloutTest \ --result-format human \ --synchronous ``` **Do not commit if deploy fails or tests fail.** For metadata-only tasks (adding custom fields, no Apex changes): deploy and confirm the object deploys cleanly, but you do not need to run all test classes — run a smoke test against the affected test class only. ### 5. Commit and Mark Done Commit with this exact trailer format: ``` (): Agent: claude-sonnet-4-6 Tests: N/N passing | N/A (metadata-only) Tests-Added: +N | 0 TypeScript: N/A (Apex project) ``` Then mark the task `- [x]` in `IMPLEMENTATION_PLAN.md` and commit that update in the same commit. ### 6. Exit Output a brief summary (what you did, test results, what is next) and exit. The loop will restart you with fresh context for the next task. --- ## Rules 1. **One task per iteration.** Never work on multiple tasks. 2. **Read before writing.** Always read the existing class/LWC before modifying it. 3. **Follow existing patterns.** The CLM tracking pattern is the model for eSignature tracking. 4. **Tests are mandatory for every Apex change.** Add to the existing test classes — do not create new ones unless the spec says to. 5. **Never add fields or methods not required by the spec.** Implement what is asked, nothing more. 6. **Never modify production data.** All DML in tests uses `@isTest` and `Test.startTest()/stopTest()`. 7. **Mock HTTP callouts in tests.** Use `HttpCalloutMock` — same pattern as existing test classes. 8. **Deploy before committing.** Never commit code that does not deploy cleanly. 9. **Follow DECISIONS.md.** Do not change approaches listed as Accepted without escalating. 10. **If stuck, escalate.** Do not invent missing requirements. --- ## Escalation Protocol Stop and add this block at the top of `IMPLEMENTATION_PLAN.md`, then output `STUCK`: ```markdown ## ESCALATION REQUIRED - **Task:** [current task] - **Issue:** [what is ambiguous/missing/conflicting] - **What I need:** [specific question or decision] - **What I'd do if I had to guess:** [best guess] ``` Escalate when: - The spec has no FR covering a required decision - A constraint in DECISIONS.md conflicts with the spec - A Salesforce platform limit or API behavior is unclear - A named credential or metadata record is missing from the org - Any task requires deleting or overwriting existing custom fields already in use --- ## Output Signals - `PLANNED` — plan created, ready for build - `DONE` — all tasks complete - `STUCK` — needs human intervention - `ERROR` — unrecoverable error --- ## Project Structure ``` force-app/main/default/ ├── classes/ │ ├── CLMAdminService.cls ← orchestration + persistDocGenResult pattern │ ├── CLMAdminServiceTest.cls ← test pattern to follow │ ├── CLMDocGenCallout.cls │ ├── CLMDocGenCalloutTest.cls │ ├── DocusignESignatureService.cls ← add createEnvelope() here │ ├── DocusignESignatureServiceTest.cls │ ├── AppraiserCasePayloadBuilder.cls │ └── AppraiserCasePayloadBuilderTest.cls ├── lwc/ │ ├── clmDocGenWorkbench/ ← add Send for Signature button here │ └── docusignEsignWorkbench/ ← read-only browsing (do not modify Phase 2) └── objects/ └── Appraiser_Case__c/ └── fields/ ← add 5 eSignature tracking fields here ``` --- ## SF CLI Invocation (Always Use This Pattern) ```bash NODE=/home/paulh/.nvm/versions/node/v22.22.0/bin/node SF=/home/paulh/.nvm/versions/node/v22.22.0/lib/node_modules/@salesforce/cli/bin/run.js $NODE $SF ``` Target org alias: `appraiser-dev` --- ## Context Anchor - **Phase 1 is complete** — CLM doc generation works end-to-end. Do not modify it. - **Phase 2 goal** — after a CLM doc is generated and attached, enable sending it for eSignature using a DocuSign template (Option A). - **The authoritative plan** is in `NEXT_STEPS_DOCGEN.md` under Phase 2. `IMPLEMENTATION_PLAN.md` is the execution tracker derived from it.