* @W-21955450@ Rename topic to subagent for Agent Script v2
Aligns with Agent Script v2 naming standards where `topic` is renamed
to `subagent` across all skill documentation and templates.
Changes:
- Agent Script templates: topic keyword → subagent keyword
- References: @topic.* → @subagent.*
- Documentation: Updated all skill references and guides
- Natural language references preserved in comments/descriptions
* Rename start_agent topic_selector to agent_router
Completes the topic → subagent terminology alignment by:
1. Renaming start_agent from topic_selector to agent_router (15 agent files)
2. Updating template topic declarations: topic {{placeholder}} → subagent {{placeholder}} (5 files)
3. Updating all @subagent.topic_selector references to @subagent.agent_router (35 occurrences)
4. Updating documentation: prose, examples, and diagrams (10 markdown files)
5. Updating comments to use agent_router terminology
Files affected:
- 22 agent template files
- 10 documentation/reference markdown files
- Template component files
The agent_router name is more descriptive of its actual function
(routing to different subagents) and completes the Agent Script v2
terminology standardization.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
* Rename files with "topic" to use "subagent" terminology
Completes the topic → subagent terminology alignment by renaming
files and updating all references:
**Files renamed (5):**
- multi-topic.agent → multi-subagent.agent
- template-single-topic.agent → template-single-subagent.agent
- template-multi-topic.agent → template-multi-subagent.agent
- topic-with-actions.agent → subagent-with-actions.agent
- agent-topic-map-diagrams.md → agent-subagent-map-diagrams.md
**References updated (6 docs):**
- Updated all filename references to point to new filenames
- Updated "Topic Map" → "Subagent Map" throughout documentation
- Updated "multi-topic"/"single-topic" → "multi-subagent"/"single-subagent"
Files modified:
- README.md, SKILL.md, agent-spec-template.md
- assets/agents/README.md, assets/README-legacy.md
- references/agent-design-and-spec-creation.md
This ensures consistent "subagent" terminology across filenames,
file content, and all documentation references.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
* Complete topic-to-subagent terminology update across skills
Comprehensive update replacing "topic" with "subagent" terminology throughout
the developing-agentforce and testing-agentforce skills to align with Agent
Script's `subagent` block naming.
Key changes:
- "Topic Selector" → "Subagent Router" in all agent templates and docs
- "Topic/action" → "Subagent/action" in documentation
- "Topic map" → "Subagent map" in diagram references
- Updated all architecture documentation to use "subagent" terminology
- Updated 19 .agent template files with new labels and comments
- Updated 8 reference documentation files with consistent terminology
API contract preservation:
- Test spec YAML files preserve "topic" terminology to match Testing Center API
- Added clarifying comments explaining topic/subagent equivalence in YAML files
- Field names like `expectedTopic` unchanged (Salesforce API requirement)
Preserved terms:
- "off-topic" (standard phrase for out-of-scope)
- "expectedTopic" field (Testing Center API)
- "platform topics" (Salesforce guardrail features)
32 files changed, 379 insertions(+), 366 deletions(-)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
* Complete comprehensive topic-to-subagent terminology update
Thorough update replacing all remaining "topic" references with "subagent"
terminology across developing-agentforce, testing-agentforce, and
observing-agentforce skills to fully align with Agent Script's `subagent`
block naming.
Key changes:
- Agent Script syntax: @topic.<name> → @subagent.<name>
- Agent Script syntax: topic.actions → subagent.actions
- Shell script patterns: ^topic → ^subagent
- Documentation: "topic instructions" → "subagent instructions"
- observing-agentforce skill: Updated all agent architecture references
- Template files: Updated all inline comments and descriptions
- Variable names in scripts: TOPIC → SUBAGENT
Specific updates:
- 45 files changed, 294 insertions, 294 deletions
- Updated all Agent Script code examples to use @subagent syntax
- Updated observing-agentforce issue classification guide
- Updated shell script patterns in diagnostic tools
- Updated Apex comments to clarify topic field maps to subagents
Preserved (as required):
- "off-topic" and "off_topic" (standard out-of-scope phrase)
- Testing Center API fields: expectedTopic, topic: in YAML
- API response fields: .topic, generatedData.topic, topic_assertion
- STDM field names: ssot__TopicApiName__c (with clarifying docs)
- Template placeholders in test specs (API values)
- "Topic hash drift" (API field behavior)
- "Email topic/purpose" (means email subject)
- Explanatory comments about API field mapping
All Agent Script syntax and documentation now consistently uses "subagent"
while preserving backward compatibility with platform API field names.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
* a few more topic -> subagent replacements
---------
Co-authored-by: Steve Hetzel <shetzel@salesforce.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
6.6 KiB
Architecture Patterns
Extracted from SKILL.md Section 8. This file is loaded on demand when architecture pattern guidance is needed.
All architecture patterns below work for both
AgentforceServiceAgentandAgentforceEmployeeAgent. The only difference is that employee agents cannot use@utils.escalateorconnection messaging:— replace escalation with a@utils.transitionto a help subagent or an action that creates a case/ticket.
When to Use Each Pattern
| Pattern | Use When |
|---|---|
| Hub-and-Spoke | Agent has 2+ distinct subagents with different intents (most common) |
| Verification Gate | Sensitive data, payments, or PII require identity verification first |
| Post-Action Loop | Actions produce state that drives follow-up logic (e.g., risk scoring) |
| Single Subagent | Agent serves one focused purpose with no routing needed |
Hub-and-Spoke (Most Common)
A central agent_router routes to specialized spoke subagents. Each spoke has a "back to hub" transition. Use when users may have multiple distinct intents.
start_agent agent_router:
description: "Route user requests to the appropriate subagent"
reasoning:
instructions: |
You are a router only. Do NOT answer questions directly.
Always use a transition action to route immediately.
actions:
to_orders: @utils.transition to @subagent.order_support
description: "Order questions"
to_returns: @utils.transition to @subagent.return_support
description: "Return or refund requests"
to_general: @utils.transition to @subagent.general_support
description: "General questions"
subagent order_support:
description: "Handle order inquiries"
reasoning:
instructions: ->
| Help the customer with their order.
actions:
lookup: @actions.get_order
description: "Look up order"
back: @utils.transition to @subagent.agent_router
description: "Route to a different subagent"
Routing lives in
start_agent-- put all transition actions directly instart_agent agent_router:. Do NOT create a separate routing-only subagent (e.g.main_menu,central_hub) -- that duplicates the router, adds an extra LLM hop (~3-5s latency), and confuses the platform. Subagents that need "go back" should transition to@subagent.agent_router.
Verification Gate
Users must pass through identity verification before accessing protected subagents. Use when handling sensitive data, payments, or PII.
start_agent agent_router:
description: "Route through identity verification"
reasoning:
instructions: |
You are a router only. Do NOT answer questions directly.
Route all users to identity verification first.
actions:
verify: @utils.transition to @subagent.identity_verification
description: "Begin verification"
subagent identity_verification:
description: "Verify customer identity"
reasoning:
instructions: ->
if @variables.failed_attempts >= 3:
| Too many failed attempts. Transferring to human agent.
transition to @subagent.escalation
if @variables.is_verified == True:
| Identity verified! How can I help?
if @variables.is_verified == False:
| Please verify your identity.
actions:
verify_email: @actions.verify_identity
description: "Verify customer email"
set @variables.is_verified = @outputs.verified
to_account: @utils.transition to @subagent.account_mgmt
description: "Account management"
available when @variables.is_verified == True
escalate_now: @utils.escalate
description: "Transfer to human"
Post-Action Loop
The subagent re-resolves after an action completes. Place post-action checks at the TOP of instructions: -> so they trigger on the loop:
reasoning:
instructions: ->
# POST-ACTION CHECK (at TOP - triggers on re-resolution)
if @variables.refund_status == "Approved":
run @actions.create_crm_case
with customer_id = @variables.customer_id
transition to @subagent.confirmation
# PRE-LLM: Load data
run @actions.load_risk_score
with customer_id = @variables.customer_id
set @variables.risk_score = @outputs.score
# DYNAMIC INSTRUCTIONS
| Risk score: {!@variables.risk_score}
if @variables.risk_score >= 80:
| HIGH RISK - Offer retention package.
else:
| STANDARD - Follow normal process.
Migrating to Hub-and-Spoke
When refactoring a flat agent (all logic in one subagent) into hub-and-spoke:
- Identify distinct intents — each becomes a spoke subagent
- Move instructions and actions from the monolithic subagent into spoke subagents. Each spoke needs BOTH its Level 1 action definitions (under
subagent > actions) AND Level 2 action invocations (undersubagent > reasoning > actions). - Create
start_agent agent_router:with transition actions pointing to each spoke - Add "back to hub" transitions in each spoke:
@utils.transition to @subagent.agent_router - Re-preview immediately — verify subagent routing works before making further changes
Common migration mistakes:
- Creating a separate
main_menusubagent instead of usingstart_agent agent_router:as the hub — adds an unnecessary LLM hop - Leaving action definitions in
start_agentinstead of moving them to spoke subagents — all actions visible in all subagents, confusing the planner - Forgetting to add "back to hub" transitions — users get stuck in a spoke subagent
- If trace shows
topic: "DefaultTopic", check that subagent descriptions contain keywords matching test utterances
Multi-Intent Handling
When a user sends multiple intents in one message, the start_agent router should handle the first intent and queue the second:
instructions: |
You are a router only. Do NOT answer questions directly.
If the user asks about multiple subagents in one message, route to the first
subagent. After that task is complete, remind the user about the other request.
Handling Incomplete Action Inputs
- Use
with param = ...(slot-fill) for inputs the LLM should extract from conversation - Add instructions that tell the LLM to invoke the action with whatever data is available
- Anti-pattern: Making the LLM ask for ALL inputs before invoking
Controlling Opportunistic Action Chains
In long action chains (A->B->C->D), the LLM may invoke downstream actions as soon as prerequisites are met. To control this:
- Add explicit gating in instructions: "Only invoke generate_resolution if the user explicitly asks"
- Use
available whenguards on downstream actions - Distinguish between "analyze only" and "full resolution" workflows in instructions
Anti-pattern: Leaving action chains ungated so the LLM runs the entire pipeline for every query.