Track and update action item status from natural language updates like 'Seanのメールには返信しておいた' or 'Lu対応予定'. Integrates with daily-comms-ops workflow. Use when managing action items across communication channels.
中文简介正在准备中。当前显示原文说明。
Expert guidance for Salesforce system development and operations management. Use this skill when working with Salesforce configuration, customization, bug analysis, troubleshooting access/permission issues, designing system architecture, or implementing custom Apex/LWC development. Covers sharing settings, approval processes, trigger patterns, integration design, and data modeling best practices.
中文简介正在准备中。当前显示原文说明。
实测评分 未实测
查看安装方法安装前可以查看交给 AI 代理的指令内容。
This skill provides comprehensive guidance for Salesforce system development and operations management, covering configuration, customization, bug analysis, architecture design, and custom development patterns. Use this skill when encountering Salesforce-specific challenges, designing solutions, or troubleshooting issues related to permissions, approval processes, integrations, or custom code.
Invoke this skill when:
Troubleshoot and configure Salesforce's multi-layered security model.
Common Scenarios:
Issue: User cannot access related records
Example: Opportunity Owner changed, but new owner cannot see related Contacts
Diagnosis Process:
1. Check Contact OWD setting (Setup → Sharing Settings)
2. Verify Contact ownership
3. Check role hierarchy relationship
4. Review sharing rules
5. Query ContactShare records for access grants
Solutions:
- Change Contact OWD to "Controlled by Parent"
- Create sharing rule based on Opportunity Owner
- Implement Apex sharing in trigger
- Add user to Account Team
Issue: Lead conversion sharing
Example: After Lead conversion, converter loses access to created Contact/Account
Solutions:
- Enable "Grant Access Using Hierarchies"
- Create sharing rules for converters
- Implement team-based sharing
- Use Apex to grant manual sharing
Reference: Load references/sharing_settings_guide.md for comprehensive troubleshooting checklist, common access patterns, Apex sharing code examples, and performance considerations.
Key Apex Pattern:
// Share Contact with Opportunity Owner
public static void shareContactWithOwner(Id contactId, Id ownerId) {
ContactShare share = new ContactShare(
ContactId = contactId,
UserOrGroupId = ownerId,
ContactAccessLevel = 'Read',
RowCause = Schema.ContactShare.RowCause.Manual
);
insert share;
}
Design, implement, and debug approval processes.
Common Scenarios:
Issue: "No applicable approval process was found"
Diagnosis:
1. Verify active approval process exists for object
2. Check entry criteria matches record
3. Confirm record not already in approval
4. Review filter criteria if using auto-submission
Debug Query:
SELECT Name, TableEnumOrId, State
FROM ProcessDefinition
WHERE TableEnumOrId = 'Opportunity' AND State = 'Active'
Issue: Wrong approver assigned
Solutions:
- Validate user field is populated and user active
- Check queue membership
- Specify fallback approver in process
- Implement Apex-based dynamic assignment
Issue: Can bypass approval by direct edit
Solution: Validation Rule
AND(
ISCHANGED(Discount_Percent__c),
TEXT(Status__c) = 'Approved',
$Profile.Name <> 'System Administrator'
)
Error: Cannot edit approved record. Submit for re-approval.
Reference: Load references/approval_process_guide.md for approval patterns (single-step, multi-step, parallel, conditional), submission methods, action configuration, testing strategies, and monitoring queries.
Apex Submission Pattern:
Approval.ProcessSubmitRequest req = new Approval.ProcessSubmitRequest();
req.setObjectId(recordId);
req.setSubmitterId(UserInfo.getUserId());
req.setComments('Submitted via automation');
Approval.ProcessResult result = Approval.process(req);
if (result.isSuccess()) {
System.debug('Submitted: ' + result.getInstanceId());
}
Implement scalable, maintainable Apex and Lightning Web Components.
Trigger Handler Pattern:
// Trigger (minimal logic)
trigger OpportunityTrigger on Opportunity (before insert, before update,
after insert, after update) {
OpportunityTriggerHandler.execute();
}
// Handler (all business logic)
public class OpportunityTriggerHandler {
private static Boolean isExecuting = false;
public static void execute() {
if (isExecuting) return; // Prevent recursion
isExecuting = true;
try {
if (Trigger.isBefore) {
if (Trigger.isInsert) handleBeforeInsert(Trigger.new);
else if (Trigger.isUpdate) handleBeforeUpdate(Trigger.new, Trigger.oldMap);
} else if (Trigger.isAfter) {
if (Trigger.isInsert) handleAfterInsert(Trigger.new);
else if (Trigger.isUpdate) handleAfterUpdate(Trigger.new, Trigger.oldMap);
}
} finally {
isExecuting = false;
}
}
private static void handleAfterUpdate(List<Opportunity> newOpps,
Map<Id, Opportunity> oldMap) {
List<Id> ownerChangedOpps = new List<Id>();
for (Opportunity opp : newOpps) {
if (opp.OwnerId != oldMap.get(opp.Id).OwnerId) {
ownerChangedOpps.add(opp.Id);
}
}
if (!ownerChangedOpps.isEmpty()) {
OpportunityService.shareRelatedContactsWithNewOwner(ownerChangedOpps);
}
}
}
Service Layer Pattern:
public class OpportunityService {
public static void shareRelatedContactsWithNewOwner(List<Id> opportunityIds) {
// Query opportunities with contacts
Map<Id, Opportunity> oppMap = new Map<Id, Opportunity>([
SELECT Id, OwnerId, Customer_Tenant_Name__c
FROM Opportunity
WHERE Id IN :opportunityIds
AND Customer_Tenant_Name__c != null
]);
List<ContactShare> shares = new List<ContactShare>();
for (Opportunity opp : oppMap.values()) {
shares.add(new ContactShare(
ContactId = opp.Customer_Tenant_Name__c,
UserOrGroupId = opp.OwnerId,
ContactAccessLevel = 'Read',
RowCause = Schema.ContactShare.RowCause.Manual
));
}
if (!shares.isEmpty()) {
Database.insert(shares, false);
}
}
}
Lightning Web Component Pattern:
// opportunityList.js
import { LightningElement, wire } from 'lwc';
import getOpportunities from '@salesforce/apex/OpportunityController.getOpportunities';
export default class OpportunityList extends LightningElement {
opportunities;
error;
@wire(getOpportunities)
wiredOpportunities({ error, data }) {
if (data) {
this.opportunities = data;
this.error = undefined;
} else if (error) {
this.error = error;
this.opportunities = undefined;
}
}
}
Reference: Load references/custom_development_patterns.md for trigger frameworks, batch apex, queueable patterns, LWC communication, testing strategies, and governor limit optimization.
Design scalable, maintainable Salesforce architectures.
Object Relationship Decision Matrix:
| Criteria | Master-Detail | Lookup |
|---|---|---|
| Child independence | No | Yes |
| Roll-up summaries | Yes | No |
| Reparenting | No | Yes |
| Sharing inheritance | Yes | No |
| Delete cascade | Yes | No |
Many-to-Many Pattern (Junction Object):
Project (Master) ←─ Project_Assignment (Junction) ─→ Resource (Master)
Project_Assignment__c:
- Project__c (Master-Detail to Project)
- Resource__c (Master-Detail to Resource)
- Role__c (Picklist: Developer, QA, PM)
- Allocation_Percent__c (Number: 0-100)
- Start_Date__c, End_Date__c
Governor Limit Optimization:
// BAD - SOQL in loop
for (Opportunity opp : Trigger.new) {
Account acc = [SELECT Name FROM Account WHERE Id = :opp.AccountId];
opp.Account_Name__c = acc.Name;
}
// GOOD - Bulkified with Map
Set<Id> accountIds = new Set<Id>();
for (Opportunity opp : Trigger.new) {
accountIds.add(opp.AccountId);
}
Map<Id, Account> accountMap = new Map<Id, Account>([
SELECT Id, Name FROM Account WHERE Id IN :accountIds
]);
for (Opportunity opp : Trigger.new) {
if (accountMap.containsKey(opp.AccountId)) {
opp.Account_Name__c = accountMap.get(opp.AccountId).Name;
}
}
Integration Pattern - REST API:
@RestResource(urlMapping='/api/opportunities/*')
global with sharing class OpportunityAPI {
@HttpGet
global static OpportunityResponse getOpportunity() {
RestRequest req = RestContext.request;
String oppId = req.requestURI.substring(req.requestURI.lastIndexOf('/') + 1);
try {
Opportunity opp = [
SELECT Id, Name, Amount, StageName
FROM Opportunity WHERE Id = :oppId LIMIT 1
];
return new OpportunityResponse(true, 'Success', opp);
} catch (Exception e) {
return new OpportunityResponse(false, e.getMessage(), null);
}
}
@HttpPost
global static OpportunityResponse createOpportunity(OpportunityRequest reqBody) {
try {
Opportunity opp = new Opportunity(
Name = reqBody.name,
Amount = reqBody.amount,
StageName = reqBody.stage,
CloseDate = reqBody.closeDate
);
insert opp;
return new OpportunityResponse(true, 'Created', opp);
} catch (Exception e) {
RestContext.response.statusCode = 400;
return new OpportunityResponse(false, e.getMessage(), null);
}
}
}
Reference: Load references/architecture_best_practices.md for data modeling strategies, LDV design, indexing, governor limit patterns, integration patterns, security architecture, and testing strategies.
When analyzing Salesforce bugs, follow this systematic approach:
For Access Issues:
For Approval Issues:
For Relationship Issues:
Provide multiple options ranked by:
Include code examples when applicable.
Include:
with sharing unless specific reasonSecurity.stripInaccessible() for dynamic queriesThis skill includes comprehensive reference documentation:
sharing_settings_guide.md
approval_process_guide.md
custom_development_patterns.md
architecture_best_practices.md
Load these references as needed to inform your analysis and solutions.
User Request: "Manager created Opportunity, assigned to Rep. Rep cannot see related Contact."
Analysis:
Solution Options:
Option 1: Change OWD (Quick)
Setup → Sharing Settings → Contact → "Controlled by Parent"
- Contact access inherits from Account
- If Rep has Opportunity, they get Account and Contact access
Option 2: Sharing Rule (Moderate)
Setup → Sharing Settings → Contact → New Sharing Rule
Based on: Opportunity Owner
Share with: Opportunity Owner's Role
Access: Read
Option 3: Apex Trigger (Long-term)
trigger OpportunityTrigger on Opportunity (after update) {
for (Opportunity opp : Trigger.new) {
if (opp.OwnerId != Trigger.oldMap.get(opp.Id).OwnerId) {
ContactShare share = new ContactShare(
ContactId = opp.Customer_Tenant_Name__c,
UserOrGroupId = opp.OwnerId,
ContactAccessLevel = 'Read',
RowCause = Schema.ContactShare.RowCause.Manual
);
insert share;
}
}
}
User Request: "Getting 'No applicable approval process found' when submitting Residential Opportunity."
Analysis:
SELECT Name FROM ProcessDefinition WHERE TableEnumOrId = 'Opportunity' AND State = 'Active'Solution:
1. Activate approval process:
Setup → Approval Processes → Opportunity → [Process Name] → Activate
2. Verify entry criteria:
Entry Criteria: RecordType.Name = 'Residential'
3. Test with debug:
Debug Logs → Set trace flag for user → Submit record → Review "Approval Process" entries
User Request: "Design REST API for external system to create Opportunities."
Solution:
@RestResource(urlMapping='/api/v1/opportunities/*')
global with sharing class OpportunityAPI {
@HttpPost
global static APIResponse createOpportunity(OpportunityRequest req) {
Savepoint sp = Database.setSavepoint();
try {
// Validate required fields
if (String.isBlank(req.name) || req.closeDate == null) {
throw new ValidationException('Missing required fields');
}
// Find or create Account
Account acc = findOrCreateAccount(req.accountName);
// Create Opportunity
Opportunity opp = new Opportunity(
Name = req.name,
AccountId = acc.Id,
Amount = req.amount,
StageName = req.stage != null ? req.stage : 'Prospecting',
CloseDate = req.closeDate,
External_ID__c = req.externalId
);
insert opp;
return new APIResponse(true, 'Opportunity created', opp.Id);
} catch (Exception e) {
Database.rollback(sp);
RestContext.response.statusCode = 400;
return new APIResponse(false, e.getMessage(), null);
}
}
private static Account findOrCreateAccount(String accountName) {
List<Account> accounts = [
SELECT Id FROM Account WHERE Name = :accountName LIMIT 1
];
if (accounts.isEmpty()) {
Account acc = new Account(Name = accountName);
insert acc;
return acc;
}
return accounts[0];
}
global class OpportunityRequest {
public String name;
public String accountName;
public Decimal amount;
public String stage;
public Date closeDate;
public String externalId;
}
global class APIResponse {
public Boolean success;
public String message;
public String opportunityId;
public APIResponse(Boolean success, String message, String oppId) {
this.success = success;
this.message = message;
this.opportunityId = oppId;
}
}
}
// Test with cURL:
// curl -X POST https://instance.salesforce.com/services/apexrest/api/v1/opportunities/
// -H "Authorization: Bearer TOKEN"
// -H "Content-Type: application/json"
// -d '{"name":"API Test Opp","accountName":"Test Account","amount":50000,"closeDate":"2025-12-31"}'
Note: This skill provides guidance and code examples. Always test solutions in a sandbox environment before deploying to production. Follow your organization's deployment and change management processes.
还没有评价。欢迎分享你的使用感受。
无需登录即可发表。欢迎分享使用感受、提问,或说明在哪些环境下无法运行。
还没有评论。来写第一条吧。
Track and update action item status from natural language updates like 'Seanのメールには返信しておいた' or 'Lu対応予定'. Integrates with daily-comms-ops workflow. Use when managing action items across communication channels.
中文简介正在准备中。当前显示原文说明。
AI活用提案の専門コンサルタントスキル。LLM・AIエージェントの活用事例知識を基に、業界別、部門別、シーン別に最適なAI導入提案を行います。システム化、業務改善、効率化を得意とし、具体的な活用事例、期待効果、導入ステップを含む実践的な提案を提供します。Use when proposing AI/LLM adoption strategies for specific industries, departments, or business scenarios.
中文简介正在准备中。当前显示原文说明。
Generate AI-powered BPO service proposals for Japanese companies in the US market. Use when creating outsourcing proposals with AI service menus, ROI estimation, implementation roadmaps, and bilingual (JA/EN) proposal documents for 在米日系企業向けAI実装.
中文简介正在准备中。当前显示原文说明。
AI(LLM)が生成した日本語テキストの「AI臭」を検出・診断し、人間らしい文章にリライトするスキル。 Use when: 「AIっぽい文章を直して」「人間らしくリライトして」「AI臭を消して」「この文章をもっと自然にして」 「テキストのAI感を減らして」「機械っぽさを取りたい」 "make this sound more human", "remove AI tone", "humanize this text", "detect if this is AI-generated". 6つのAI特有パターン(視覚的マーカー、単調なリズム、マニュアル的構成、非コミット姿勢、抽象語の濫用、 定型メタファー)を正規表現ベースで検出し、0-100のAI臭スコアを算出。3つの人間化技法 (バランスを崩す・客観を崩す・論理を崩す)でリライトを実行する。 Note: 検出スクリプトは日本語テキスト専用。英語テキストの場合はClaude自身がreferences/を参照して分析・リライトする。
中文简介正在准备中。当前显示原文说明。
Generate audit-ready internal control design documents from As-Is business process inventories. Produces control IDs, assertion mappings, procedures, SoD analysis, KPIs, materiality thresholds, and implementation roadmaps. Use when building internal controls for new audit engagements, SOX/J-SOX compliance, or process improvement initiatives.
中文简介正在准备中。当前显示原文说明。
Review audit-related documents (control design documents, bottleneck analyses, requirements definitions, etc.) for quality, scoring them 0-100 with a severity-rated findings list. Use when reviewing audit documents, checking control design quality, or verifying cross-document consistency. Supports documents governed by US GAAP, IFRS, or J-GAAP.
中文简介正在准备中。当前显示原文说明。