From agentforce-adlc
Builds, modifies, debugs, and deploys Agentforce agents using Agent Script. Covers .agent files, actions, subagents, flow control, and CLI commands.
How this skill is triggered — by the user, by Claude, or both
Slash command
/agentforce-adlc:developing-agentforceThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
This skill is for developing Agentforce agents, primarily with Agent Script, Salesforce's scripting language for AI agents.
CHANGE-SUMMARY-skill-0.6.1.mdREADME.mdassets/agent-spec-template.mdassets/agents/README.mdassets/agents/hello-world.agentassets/agents/knowledge-grounded.agentassets/agents/local-info-agent-annotated.agentassets/agents/multi-subagent.agentassets/agents/order-service.agentassets/agents/production-faq.agentassets/agents/production-faq.bundle-meta.xmlassets/agents/router-first.agentassets/agents/simple-qa.agentassets/agents/template-multi-subagent.agentassets/agents/template-single-subagent.agentassets/agents/verification-gate.agentassets/bundle-meta.xmlassets/invocable-apex-template.clsassets/patterns/README.mdassets/patterns/action-callbacks.agentThis skill is for developing Agentforce agents, primarily with Agent Script, Salesforce's scripting language for AI agents.
⚠️CRITICAL: Agent Script is NOT AppleScript, JavaScript, Python, or any other language. Do NOT confuse Agent Script syntax or semantics with any other language you have been trained on.
Agent Script agents are defined by AiAuthoringBundle metadata: a .agent file (agent behavior) plus bundle-meta.xml (bundle metadata). Actions can be implemented with invocable Apex, autolaunched Flows, Prompt Templates, and other supported types.
This skill covers the full Agent Script lifecycle: designing agents, writing Agent Script code, validating and debugging, deploying and publishing, and testing.
This file maps user intent to task domains and relevant reference files in references/. Treat this file as the execution router for end-to-end agent development, and use references for deep detail.
Identify user intent from task descriptions. ALWAYS read indicated reference files BEFORE starting work.
Always --json. ALWAYS include --json on EVERY sf CLI command. Do NOT pipe CLI output through jq or 2>/dev/null. Read the full JSON response directly — LLMs parse JSON natively.
Verify target org. Before any org interaction, run sf config get target-org --json to confirm a target org is set. If none configured, ask the user to set one with sf config set target-org <alias>.
Diagnose before you fix. When validating/debugging agent behavior,
ALWAYS --use-live-actions to preview authoring bundles. Send utterances
then read resulting session traces to ground your understanding of the
agent's behavior. Trace files reveal subagent selection, action I/O, and
LLM reasoning. DO NOT modify .agent files or action implementations without
this grounding. See Validation & Debugging
for trace file locations and diagnostic patterns.
Spec approval is a hard gate. Never proceed past Agent Spec creation without explicit user approval.
Don't stall. After a step completes successfully, announce the next step and start it. Do not wait for the user to say "what's next" or "ok, continue." The only checkpoints that require explicit user approval are: (a) Agent Spec approval, (b) the pre-Publish CHECKPOINT, (c) any A/B branch the skill explicitly surfaces (e.g., Data Cloud not provisioned during ADL setup). Long-running async work like ADL indexing should run in the background while the skill continues with work that doesn't depend on the result.
Draft-first lifecycle. During normal authoring, stay in draft iteration:
edit .agent + action implementations, validate, deploy, and preview as many
times as needed. Do NOT publish/activate by default. Publish + activate are
explicit release actions that require the user to confirm they are ready to
commit the current draft to metadata and expose it to end users.
Default agentic, pin with cause. Use the most agentic posture that meets each subagent's requirement, and add deterministic controls only for regulation/trust gates or observed failures. For detailed posture rules, see Posture & Determinism.
No nested if or else if. Agent Script only supports flat if/else blocks. No else if, no if inside else, no if inside if. For multi-branch logic, use sequential if statements or compound conditions (if A and B:). Nested structures cause silent compile failures.
Action implementation is a user decision. During planning/spec work,
default new actions to NEEDS STUB placeholders. Always ask the user whether
they want to scan org/project for existing implementations and/or generate
new Apex/Flow/Prompt implementations before taking either path.
Every task domain below has Required Steps. Follow verbatim, in order. The default path is: design -> draft implementation loop -> validation/preview loop -> explicit user-approved release.
User wants to build new agent from scratch. ALWAYS use Agent Script. Work with User to understand the agent's purpose, subagents, and actions using plain language without Salesforce-specific terminology.
Read CLI for Agents for exact command syntax.
NEEDS STUB placeholders during planning. Ask the user which implementation path they want before implementation work:
sfdx-project.json, searching @InvocableMethod, AutoLaunchedFlow, prompt templates, external service registrations, standard invocable actions, and custom objects) if the user explicitly chooses Path B or C.
If the agent's purpose involves answering from documents (e.g., "answer customer questions from our product manual", "respond based on a policy guide", "FAQ from a PDF"), ask the user: "Will this agent answer questions from a document corpus (PDF/DOCX/TXT)? If so, what file path?" Capture the path in the Spec under a "Knowledge Grounding" section. Asking now — during requirements capture — is critical: ADL indexing takes minutes, so we want the file path captured pre-Spec-approval and provisioning kicked off as early as possible.
Always save Agent Spec as file.connection messaging: or MessagingSession linked variables. Remove if present. Exception: If the agent has a knowledge: block (uses AnswerQuestionsWithKnowledge), default_agent_user IS required even for employee agents — the platform treats knowledge-grounded agents as requiring an Einstein Agent User context at runtime. Query for the agent user and include it. See Examples for a complete employee agent example.SELECT COUNT() FROM DataKnowledgeSpace (DC provisioned check), then sf agent adl list (ADL service health check). If DC is not provisioned, present the A/B choice from that reference. If DC is provisioned but the ADL service returns 400 INTERNAL_ERROR, surface the "DC up, ADL broken" path and skip grounding for this run. If both checks pass, run sf agent adl create (reference Step 1) to capture libraryId. Compute rag_feature_config_id = "ARFPC_<libraryId>" from the libraryId alone — that's enough to author the bundle. Then start the upload + indexing flow (reference Steps 2–6) in the background while authoring continues. Per Rule 5, do not block on async indexing; retrieverId is only needed for runtime queries (gated in Step 8). Also kick off the Data Cloud permset assignment for the agent user — see Agent User Setup, Step 3b for the discovery-then-assign procedure.
Do not proceed to code generation until environment is validated (ADL provisioning may continue running in background).sf agent generate authoring-bundle --json --no-spec --name "<Label>" --api-name <Developer_Name>.agent file using reference files and templates. Do not create .agent or bundle-meta.xml files manually. If Step 3b produced a libraryId, include the top-level knowledge: block and the AnswerQuestionsWithKnowledge action wiring per Data Library Reference, section "Wiring the ADL into Agent Script". The template at assets/agents/knowledge-grounded.agent is a copy-modify starting point.sf agent validate authoring-bundle --json --api-name <Developer_Name>
If validation fails, read Validation & Debugging to diagnose and fix, then re-validate. ALWAYS fix syntax and structural errors before generating action implementations.sf template generate apex class --name <ClassName> --output-dir <PACKAGE_DIR>/main/default/classes
Replace class body with invocable pattern from Design & Agent Spec. ALWAYS deploy:
sf project deploy start --json --metadata ApexClass:<ClassName>
ALWAYS fix deploy errors BEFORE generating and deploying next stub.sf agent adl get -i $LIBRARY_ID and check that retrieverId is present (Data Library Reference, Step 6). If still null, wait and re-poll — do not preview yet, the agent will return empty knowledgeSummary and the anti-hallucination guard will refuse on every utterance.
sf agent preview start --json --use-live-actions --authoring-bundle <Developer_Name>
If actions query data, ground test utterances with:
sf data query --json -q "SELECT <Relevant_Fields> FROM <SObject> LIMIT 100"
Send test utterances with:
sf agent preview send --json --authoring-bundle <Developer_Name> --session-id <ID> -u "<message>"
Smoke testing requirements (see Validation & Debugging, Utterance Derivation):
FunctionStep). Do not trust the agent's text response alone — agents can claim they performed actions without calling them..agent file and re-preview. For complex issues, switch to Diagnose Behavioral Issues workflow. Return AFTER correcting issues.
CHECKPOINT — Stay in draft iteration unless user explicitly asks to release.
If user requests release, do NOT proceed to Publish unless ALL are true:validate authoring-bundle passes with zero errors--use-live-actions) tested with realistic utterances covering all routing branchesFunctionStep present), and spec-compliant behaviorknowledge: block: the Einstein Agent User has a Data Cloud permset/PSL assigned. Verify both:
sf data query --json -q "SELECT PermissionSet.Name FROM PermissionSetAssignment WHERE Assignee.Username='<agent_user>'"
sf data query --json -q "SELECT PermissionSetLicense.DeveloperName FROM PermissionSetLicenseAssign WHERE Assignee.Username='<agent_user>'"
One of GenieDataPlatformStarterPsl, GenieUserEnhancedSecurity, DataCloudUser, or DataCloudArchitect must appear in the combined results. If none does, run Agent User Setup, Step 3b discovery-then-assign and re-verify before proceeding. If a Data Cloud permset is assigned but a smoke-test grounded query returns empty knowledgeSummary, the Data Space scope also needs to be granted on that permset — UI-only, see Agent User Setup, Step 3b.4.sf agent publish authoring-bundle --json --api-name <Developer_Name>
If publish fails, follow troubleshooting checklist in Metadata & Lifecycle, Section 5 before retrying.sf agent activate --json --api-name <Developer_Name>sf agent preview start --json --api-name <Developer_Name>
Use --api-name, not --authoring-bundle..agent via the knowledge: block + AnswerQuestionsWithKnowledge actionUser wants to understand Agent Script agent they didn't write or need to revisit. May point to AiAuthoringBundle directory or ask "what does this agent do?" or "I need to fix this agent but I don't understand how it works.".
sfdx-project.json to identify package directories. Find AiAuthoringBundle directory within them. Read .agent file and bundle-meta.xml..agent file.target, locate implementation (Apex class, Flow, Prompt Template) in project. Note input/output contracts..agent file explaining flow control decisions, gating rationale, and subagent relationships.User wants to add, remove, or change subagents, actions, instructions, or flow control on existing agent. May describe change in plain language ("add a billing subagent") or reference specific Agent Script constructs.
Read CLI for Agents for exact command syntax.
NEEDS STUB placeholders. Ask the user which path they want:
.agent already has a knowledge: block with a populated rag_feature_config_id AND the user is keeping the same library, reuse it. Skip provisioning. (No need to confirm retrieverId here — that gate moves to Step 8.)sf agent adl list), and (if DC is ready) run sf agent adl create (Step 1) to capture libraryId. Compute rag_feature_config_id = "ARFPC_<libraryId>" from libraryId alone — that's enough to author the bundle. Start the upload + indexing flow (reference Steps 2–6) in the background while you continue to Step 5 (Edit code). Per Rule 5, do not block on async indexing. Also kick off the Data Cloud permset assignment for the agent user — see Agent User Setup, Step 3b..agent file to implement approved changes. If Step 4 produced a libraryId, include or update the knowledge: block and the AnswerQuestionsWithKnowledge action per Data Library Reference.sf agent validate authoring-bundle --json --api-name <Developer_Name>
If validation fails, read Validation & Debugging to diagnose and fix, then re-validate.sf template generate apex class --name <ClassName> --output-dir <PACKAGE_DIR>/main/default/classes
Replace class body with invocable pattern from Design & Agent Spec. ALWAYS deploy:
sf project deploy start --json --metadata ApexClass:<ClassName>
ALWAYS fix deploy errors BEFORE generating and deploying next stub. Skip if no new actions added.sf agent adl get -i $LIBRARY_ID and check that retrieverId is present (Data Library Reference, Step 6). If still null, wait and re-poll — do not preview yet, the agent will return empty knowledgeSummary and the anti-hallucination guard will refuse on every utterance.
sf agent preview start --json --use-live-actions --authoring-bundle <Developer_Name>
If actions query data, ground test utterances with:
sf data query --json -q "SELECT <Relevant_Fields> FROM <SObject> LIMIT 100"
Send test utterances with:
sf agent preview send --json --authoring-bundle <Developer_Name> --session-id <ID> -u "<message>"
Smoke testing requirements (see Validation & Debugging, Utterance Derivation):
FunctionStep). Do not trust the agent's text response alone..agent file and re-preview. For complex issues, switch to Diagnose Behavioral Issues workflow.
CHECKPOINT — Stay in draft iteration unless user explicitly asks to release.
If user requests release, do NOT proceed to Publish unless ALL are true:validate authoring-bundle passes with zero errors--use-live-actions) tested with realistic utterances covering all routing branchesFunctionStep present), and spec-compliant behaviorknowledge: block: the Einstein Agent User has a Data Cloud permset/PSL assigned. Verify both:
sf data query --json -q "SELECT PermissionSet.Name FROM PermissionSetAssignment WHERE Assignee.Username='<agent_user>'"
sf data query --json -q "SELECT PermissionSetLicense.DeveloperName FROM PermissionSetLicenseAssign WHERE Assignee.Username='<agent_user>'"
One of GenieDataPlatformStarterPsl, GenieUserEnhancedSecurity, DataCloudUser, or DataCloudArchitect must appear in the combined results. If none does, run Agent User Setup, Step 3b discovery-then-assign and re-verify before proceeding. If a Data Cloud permset is assigned but a smoke-test grounded query returns empty knowledgeSummary, the Data Space scope also needs to be granted on that permset — UI-only, see Agent User Setup, Step 3b.4.sf agent publish authoring-bundle --json --api-name <Developer_Name>
If publish fails, follow troubleshooting checklist in Metadata & Lifecycle, Section 5 before retrying.sf agent activate --json --api-name <Developer_Name>sf agent preview start --json --api-name <Developer_Name>
Use --api-name, not --authoring-bundle.User has Agent Script that won't compile. Errors surface from sf agent validate or sf agent preview start, or User describes symptoms like "I'm getting a validation error."
Read CLI for Agents for exact command syntax.
sf agent validate authoring-bundle --json --api-name <Developer_Name>
to capture basic compile errors. If no errors, run
sf agent preview start --json --use-live-actions --authoring-bundle <Developer_Name>
to capture complex compile errors. If reproduction differs from user-provided errors, call out both and continue with the current reproducible errors..agent file that cause each error.sf agent validate authoring-bundle --json --api-name <Developer_Name>
then run
sf agent preview start --json --use-live-actions --authoring-bundle <Developer_Name>
Repeat steps 2–5 if errors persist.Agent compiles, preview can start and --use-live-actions, but agent does not behave as expected. User describes symptoms like "the agent keeps going to the wrong subagent" or "the action isn't being called." Fundamentally different from validate or preview start errors — code is valid but behavior is wrong.
Read CLI for Agents for exact command syntax.
sf agent preview start --json --use-live-actions --authoring-bundle <Developer_Name>
then send test messages covering EACH subagent with sf agent preview send. One message is not enough — confirm behavior per subagent before proceeding.validate authoring-bundle, then preview start --use-live-actions to verify fix using same utterances. Then test adjacent paths that might be affected by your changes.User wants to take working agent from local development to running state in Salesforce org. Involves deploying AiAuthoringBundle and its dependencies, publishing to commit version, then activating to make it live.
Read CLI for Agents for exact command syntax.
sf agent validate authoring-bundle --json --api-name <Developer_Name>
Do not proceed if validation fails.AiAuthoringBundle and all action implementations (Apex classes, Flows, Prompt Templates) and dependencies to org.sf agent preview start --json --use-live-actions --authoring-bundle <Developer_Name>
then send test utterances with:
sf agent preview send --json --authoring-bundle <Developer_Name> --session-id <ID> -u "<message>"
Test key conversation paths to validate agent behavior when backed by live actions.
CHECKPOINT — Do NOT proceed to Publish unless ALL are true:
validate authoring-bundle passes with zero errors--use-live-actions) tested with realistic utterances covering all routing branchesFunctionStep present), and spec-compliant behaviorsf agent publish authoring-bundle --json --api-name <Developer_Name>
If publish fails, follow Troubleshooting Publish Failures in Metadata & Lifecycle before retrying.sf agent activate --json --api-name <Developer_Name>sf agent preview start --json --api-name <Developer_Name>
Use --api-name, not --authoring-bundle.User's agent is published and active but experiencing issues not caught during preview. Includes credit overconsumption, token or size limit failures, loop guardrail interruptions, reserved keyword runtime errors, VS Code sync failures, or unexpected behavioral differences between preview and production.
Read CLI for Agents for exact command syntax.
sf agent preview start --json --api-name <Developer_Name>
(not --authoring-bundle). Compare against live-actions authoring bundle preview --authoring-bundle <Developer_Name> --use-live-actions to isolate preview-vs-production differences.User wants to remove agent or change its name. Maintenance tasks complicated by AiAuthoringBundle versioning and published version dependencies.
Read CLI for Agents for exact command syntax.
sf agent deactivate --json --api-name <Developer_Name>
Active agent cannot be deleted or renamed.User wants to create automated tests for Agent Script agent. Involves writing AiEvaluationDefinition test specs in YAML format that define test scenarios, expected behaviors, and quality metrics.
Read CLI for Agents for exact command syntax.
specs/<Agent_API_Name>-testSpec.yaml in SFDX project.AiEvaluationDefinition from test spec using CLI.AiEvaluationDefinition to org.Agent Spec is the central artifact this skill produces and consumes. A structured design document representing agent purpose, user outcomes, subagent graph, actions and implementations, variables, subagent posture, deterministic controls (when needed), and behavioral intent.
Agent Specs evolve with the agent. Sparse during agent creation (purpose, use cases, planned placeholders). Fleshed out during agent build (flowchart, action implementations mapped, posture choices documented, deterministic controls added only where justified). Reverse-engineered when comprehending existing agents. Critical for advanced troubleshooting, providing reference to compare expected vs. actual behavior. During testing, test coverage maps against it.
Always produce or update Agent Spec as first step of any operation that changes or analyzes agent. It is consistent grounding to work from, and a durable artifact a developer can review.
Read Design & Agent Spec for Agent Spec structure and production methodology.
The assets/ directory contains templates and examples. Read when you need a starting point or a concrete reference for artifacts and source files.
assets/agent-spec-template.md — Agent Spec template with all sections and placeholder content. Copy to <AgentName>-AgentSpec.md in project directory, then fill in during design. Save Agent Spec as file — significant design artifact that benefits from proper rendering, especially Mermaid Subagent Map diagram.
assets/agents/local-info-agent-annotated.agent — Complete annotated example based on Local Info Agent, showing all major Agent Script constructs in context with inline comments explaining why each construct is used. Read when you need concrete reference for how concepts compose into working agent, or as fallback when focused examples in reference files aren't sufficient.
assets/agents/template-single-subagent.agent — Minimal agent with one subagent. Copy and modify for simple agents.
assets/agents/template-multi-subagent.agent — Minimal agent with multiple subagents and transitions. Copy and modify for complex agents.
assets/invocable-apex-template.cls — Reference for invocable Apex
classes. Copy and modify when complex Apex action implementations are desired.
Use only Salesforce CLI and Salesforce org. Do not reference or depend on other skills, MCP servers, or external tooling. All commands use sf (Salesforce CLI).
Only certain implementation types are valid for actions. For example, only invocable Apex (not arbitrary Apex classes) can back an action. Similar constraints may apply to Flows and Prompt Templates. When wiring actions to implementations, consult Design & Agent Spec reference file for valid types and stubbing methodology.
sf agent generate test-spec is not for agentic use. It is interactive, REPL-style command designed for humans. When creating test specs, start from boilerplate template in assets instead.
Internal Error, try again later during publish:
Server-side compile failure. The 500 doesn't tell you which check failed — walk all four causes in order before asking the user what's wrong. Do NOT stop at cause 1.
default_agent_user. Employee agent must NOT have default_agent_user; service agent MUST have it (and the user must hold an Einstein Agent license). See Design & Agent Spec, Section 3. Re-run the query — do not invent the username.outputs: block. If any action has target: and inputs: but no outputs:, the server-side compiler can't generate return bindings. CLI validate and LSP both PASS — only publish fails. See Known Issues, Issue 15..agent file. Diff against a known-good bundle in the same org:
sf project retrieve start --metadata "AiAuthoringBundle:<known-working-agent>" --output-dir /tmp/diff-bundle --json
Compare keyword-by-keyword. Look for missing required-but-undocumented fields, block-ordering drift, or DSL keywords your bundle uses that aren't in the working one.requestId differs across retries, wait 60 s and retry once.Unable to access Salesforce Agent APIs... during preview:
default_agent_user lacks permissions. See Agent User Setup & Permissions. Do NOT publish as fix — --use-live-actions does not require published agent.
Permission error referencing different username than configured: Same fix as above — error references org's default running user, but root cause is Einstein Agent User permissions.
Agent fails with permission error even though current subagent's actions work: Planner validates ALL actions across ALL subagents at startup. One missing permission fails entire agent.
Apex action returns empty results in live preview but works in simulated:
WITH USER_MODE + missing object permissions = silent failure (0 rows, no error). See Agent User Setup & Permissions, Section 6.2.
Agent published, ADL indexed (retrieverId populated), but every grounded question returns empty knowledgeSummary / "I don't have that information":
The Einstein Agent User lacks Data Cloud access. Two things to check, in order:
GenieDataPlatformStarterPsl PSL → GenieUserEnhancedSecurity PS → DataCloudUser PS → DataCloudArchitect PS).default) → Save. See Agent User Setup, Step 3b.4.npx claudepluginhub salesforceairesearch/agentforce-adlc --plugin agentforce-adlcBuild, modify, debug, and deploy agents with Agentforce Agent Script — Salesforce's scripting language for AI agents on the Atlas Reasoning Engine. Covers `.agent` files, subagents, actions, validation, CLI commands, and publishing.
Builds, modifies, debugs, and deploys Salesforce Agentforce AI agents using Agent Script, .agent files, aiAuthoringBundle metadata, and sf CLI commands like generate, preview, publish, test.
Provides guidance on Salesforce Agentforce AI agents, Atlas Reasoning Engine, components, and 2025 features for autonomous automation.