apex-execute-anonymous
Execute Anonymous Apex: Developer Console, VS Code SFDX, `sf apex run`, variable scope, transaction semantics, governor limits, debugging output, common errors. NOT for scheduled/queueable async (use apex-async-patterns). NOT for debug log settings (use debug-log-management).
Best use case
apex-execute-anonymous is best used when you need a repeatable AI agent workflow instead of a one-off prompt.
Execute Anonymous Apex: Developer Console, VS Code SFDX, `sf apex run`, variable scope, transaction semantics, governor limits, debugging output, common errors. NOT for scheduled/queueable async (use apex-async-patterns). NOT for debug log settings (use debug-log-management).
Teams using apex-execute-anonymous should expect a more consistent output, faster repeated execution, less prompt rewriting.
When to use this skill
- You want a reusable workflow that can be run more than once with consistent structure.
When not to use this skill
- You only need a quick one-off answer and do not need a reusable workflow.
- You cannot install or maintain the underlying files, dependencies, or repository context.
Installation
Claude Code / Cursor / Codex
Manual Installation
- Download SKILL.md from GitHub
- Place it in
.claude/skills/apex-execute-anonymous/SKILL.mdinside your project - Restart your AI agent — it will auto-discover the skill
How apex-execute-anonymous Compares
| Feature / Agent | apex-execute-anonymous | Standard Approach |
|---|---|---|
| Platform Support | Not specified | Limited / Varies |
| Context Awareness | High | Baseline |
| Installation Complexity | Unknown | N/A |
Frequently Asked Questions
What does this skill do?
Execute Anonymous Apex: Developer Console, VS Code SFDX, `sf apex run`, variable scope, transaction semantics, governor limits, debugging output, common errors. NOT for scheduled/queueable async (use apex-async-patterns). NOT for debug log settings (use debug-log-management).
Where can I find the source code?
You can find the source code on GitHub using the link provided at the top of the page.
SKILL.md Source
# Apex Execute Anonymous
Activate when running ad-hoc Apex — investigation, data fixes, one-off operations. Execute Anonymous commits DML on success (unlike tests), runs as the authenticated user, and surfaces errors via debug logs. Misunderstand any of these and you'll destroy data or corrupt a production org.
## Before Starting
- **Confirm org and user.** `sf org display` — especially before running against production.
- **Plan rollback.** Anonymous Apex commits by default. Add `Database.setSavepoint`/`Database.rollback` for reversibility.
- **Estimate record volume.** Anonymous runs the full governor budget once; bulk work past ~10k records must be Batch-ified.
## Core Concepts
### Script structure
```
// my-fix.apex
List<Account> accs = [SELECT Id, Rating FROM Account WHERE Rating = null LIMIT 200];
for (Account a : accs) a.Rating = 'Warm';
update accs;
System.debug('Updated ' + accs.size());
```
### CLI invocation
```
sf apex run --target-org prod --file scripts/my-fix.apex
```
Output streams the debug log. Errors appear inline.
### Transaction semantics
- **Auto-commits on success.** No implicit savepoint.
- **Rolls back on uncaught exception.** Partial DML is reverted.
- **Can wrap manually** with `Database.setSavepoint()` + `Database.rollback(sp)`.
### Variable scope
Variables declared at the top live for the whole anonymous script. No `class` wrapper; the whole script runs inside an implicit `System.runUpdate`-like anonymous block.
### What you CAN'T do
- Define a method (only inline code and inner classes).
- Run test classes (`Test.startTest` is legal but you can't `@IsTest`-annotate code).
- Use `global`/`public` modifiers at the top level.
- Access protected members of a class outside its namespace.
### Debug output
`System.debug()` goes to the user's debug log. For `sf apex run`, the log returns to stdout. Set `Apex Code` log level to `FINE` or `FINEST` for variable values.
## Common Patterns
### Pattern: Savepoint-guarded data fix
```
Savepoint sp = Database.setSavepoint();
try {
List<Contact> cs = [SELECT Id, Email FROM Contact WHERE Email LIKE '%@old.com' LIMIT 200];
for (Contact c : cs) c.Email = c.Email.replace('@old.com', '@new.com');
update cs;
System.debug('Updated ' + cs.size());
// Flip commented lines to actually apply:
Database.rollback(sp);
} catch (Exception e) {
Database.rollback(sp);
System.debug(e);
}
```
Pattern: run with rollback first to see effect; flip to commit after review.
### Pattern: Iteration-bounded cleanup
```
Integer MAX = 200;
List<Case> oldCases = [SELECT Id FROM Case WHERE Status = 'Closed' AND IsDeleted = false LIMIT :MAX];
if (oldCases.size() == MAX) {
System.debug('Limit hit — run again or use Batch Apex');
}
delete oldCases;
```
### Pattern: Dry-run toggle
```
Boolean APPLY = false;
// ... build list of updates
System.debug('Would update ' + updates.size() + ' records');
if (APPLY) update updates;
```
## Decision Guidance
| Task | Approach |
|---|---|
| Fix <200 records one-off | Execute Anonymous with savepoint |
| Fix 200–10,000 records | Execute Anonymous with batching loop + savepoint per iteration |
| Fix >10,000 records | Batch Apex — anonymous hits governor limits |
| Investigation (no DML) | Execute Anonymous; no savepoint needed |
| Scheduled/repeated fix | Schedulable/Batch; not anonymous |
| Test a method | Test class, not anonymous |
## Recommended Workflow
1. Confirm org with `sf org display --target-org <alias>` — especially before prod.
2. Write script with dry-run toggle OR savepoint + rollback first.
3. Run via `sf apex run --file script.apex --target-org <alias>`.
4. Inspect debug log output for the counts/side-effects.
5. Flip apply flag OR comment out the rollback, re-run.
6. Archive the script in a `scripts/` directory committed to version control.
7. For production, require peer review before `--target-org prod`.
## Review Checklist
- [ ] Target org confirmed explicitly (never rely on default config for prod)
- [ ] Savepoint or dry-run toggle present for DML scripts
- [ ] Record count bounded via `LIMIT` clause
- [ ] Debug output includes before/after counts
- [ ] Script saved to repo for audit trail
- [ ] Peer review for any production anonymous script
## Salesforce-Specific Gotchas
1. **Anonymous Apex commits on success. There is no implicit savepoint.** A runaway loop will destroy data before you can interrupt.
2. **`sf apex run` without `--file` reads from stdin** — useful for piped commands but easy to confuse with execution against stdin-EOF.
3. **Governor limits are per-execution, not per-statement.** A 50k-record loop inside anonymous hits CPU/DML-row caps. Use Batch for volume.
4. **Declaring a method fails:** Anonymous cannot contain top-level method definitions. Wrap reusable logic in an inner class with a method, then call `new MyInner().doThing()`.
5. **Debug log level affects output.** If you see `System.debug()` lines missing, raise `Apex Code` to `FINE`.
## Output Artifacts
| Artifact | Description |
|---|---|
| `scripts/*.apex` | Committed scripts under version control |
| CLI runbook | `sf apex run` invocation + expected output |
| Rollback playbook | How to revert if DML committed unintended changes |
## Related Skills
- `apex/apex-savepoint-and-rollback` — transactional control details
- `apex/apex-batch-patterns` — for volume fixes
- `devops/salesforce-dx-source-tracking` — CLI fundamentalsRelated Skills
apex-managed-sharing-patterns
Grant row-level access programmatically via __Share records when declarative sharing rules cannot express the policy. NOT for OWD, role hierarchy, or criteria-based sharing rule design.
lwc-imperative-apex
Call Apex methods imperatively from LWC — on button click, lifecycle hooks, or conditional logic. Covers import syntax, cacheable vs non-cacheable, async/await patterns, error handling, loading states, and Promise.all. NOT for wire service (use wire-service-patterns) and NOT for testing Apex mocks (use lwc-testing).
dataweave-for-apex
Use when transforming structured data inside Apex — CSV → JSON, XML → SObject list, JSON → flattened CSV, or schema-mapping a third-party payload to a Salesforce model — and the existing options (`JSON.deserialize`, `Dom.Document`, hand-written loops) are getting unwieldy. Triggers: 'apex transform csv json xml without external library', 'system.dataweave script', 'salesforce native dataweave apex execute', 'transform xml to sobject apex no mulesoft', 'json reshape salesforce apex script'. NOT for MuleSoft Anypoint DataWeave running off-platform (use mulesoft-anypoint-architecture), NOT for Apex JSON serialization basics (use apex-json-serialization), NOT for Bulk API CSV ingest (use bulk-api-2-patterns).
flow-invocable-from-apex
Author @InvocableMethod Apex classes that Flow can call as Actions. Design the input / output variable contract, bulk semantics (one list in, one list out), null handling, and error surfacing. Also covers the inverse direction: calling a flow from Apex via Flow.Interview. NOT for general Apex authoring (use apex-service-selector-domain). NOT for REST-exposed Apex (use apex-rest-resource-patterns).
flow-apex-defined-types
Design and use Apex-Defined Types as Flow variables for structured non-sObject data (HTTP callout payloads, External Service responses, complex configuration). Trigger keywords: apex-defined type, flow variable, @AuraEnabled class, flow http callout response. Does NOT cover building HTTP Callout Actions themselves, External Services schema, or raw Apex invocable methods.
scheduled-apex-failure-detection-and-monitoring
Use when nightly batch / scheduled Apex jobs are failing without anyone noticing — covers why uncaught exceptions in `execute()` go to the debug log instead of email, how to query `AsyncApexJob` for `Status`, `NumberOfErrors`, and `ExtendedStatus`, when to implement `Database.RaisesPlatformEvents` so the platform publishes `BatchApexErrorEvent` on uncaught failures, how to subscribe to that event with an Apex trigger and notify operators, and how to layer a custom watcher schedule on top so silent-failure modes (job that never started, scheduled class deleted, queue stuck on `Queued`) still surface. Triggers: 'nightly batch failed at 2am with no notification', 'how do we know if a scheduled apex job is failing', 'BatchApexErrorEvent vs custom retry logic', 'Setup Apex Jobs only shows last 7 days, where else can I look', 'job is stuck in queued status nobody noticed for a week'. NOT for general Apex exception handling patterns (use apex/apex-exception-handling-and-logging), NOT for Batch Apex authoring or chunking strategy (use apex/batch-apex-design), NOT for Setup → Apex Jobs UI walkthrough as an admin task (use admin/batch-job-scheduling-and-monitoring), NOT for retry logic itself (use apex/scheduled-apex-retry-patterns once authored).
platform-events-apex
Use when publishing or subscribing to Salesforce Platform Events from Apex, comparing Platform Events with Change Data Capture, or designing event-triggered error handling and monitoring. Triggers: 'EventBus.publish', 'platform event trigger', 'CDC vs Platform Events', 'replay ID', 'high-volume event'. NOT for Flow-only publish/subscribe automation.
health-cloud-apex-extensions
Use this skill when extending Health Cloud via Apex: implementing HealthCloudGA managed-package interfaces, automating care plan lifecycle hooks, processing referrals using Industries Common Components invocable actions, or enforcing HIPAA-compliant logging governance for clinical Apex code. Trigger keywords: CarePlanProcessorCallback, HealthCloudGA namespace, ReferralRequest, ReferralResponse, care plan invocable actions, clinical Apex extension, Health Cloud Apex API. NOT for standard Apex triggers or generic Apex development unrelated to Health Cloud managed-package extension points.
fsl-apex-extensions
Use when writing Apex that calls Field Service Lightning scheduling APIs — AppointmentBookingService, ScheduleService, GradeSlotsService, or OAAS — to book, schedule, grade, or optimize service appointments programmatically. Trigger keywords: FSL Apex namespace, GetSlots, schedule service appointment via code, appointment booking API, FSL optimization API. NOT for standard Apex patterns unrelated to FSL, admin-level scheduling policy configuration, or declarative FSL scheduling.
fsc-apex-extensions
Use this skill when extending Financial Services Cloud (FSC) behavior through Apex: customizing financial rollup recalculation, disabling built-in FSC triggers to write custom trigger logic, implementing Compliant Data Sharing (CDS) participant/role integrations, or building custom FSC action handlers. NOT for standard Apex unrelated to the FSC managed package, standard Salesforce sharing rules, or configuring FSC rollups through the Admin UI — use the admin/financial-account-setup skill for declarative rollup setup.
entitlement-apex-hooks
Use this skill when writing Apex triggers or classes that interact with CaseMilestone records — completing milestones, detecting violations, or reacting to SLA state changes. Trigger keywords: CaseMilestone trigger, auto-complete milestone Apex, milestone violation polling, CompletionDate write pattern. NOT for entitlement process admin setup, milestone configuration in Setup UI, or Flow-based milestone actions.
dynamic-apex
Use when building or reviewing code that constructs SOQL/SOSL at runtime, inspects schema metadata via Schema.describe methods, accesses fields dynamically on sObjects, or performs runtime type inspection. Triggers: 'Database.query', 'Schema.getGlobalDescribe', 'Schema.describeSObjects', 'dynamic field access', 'SObjectType', 'DescribeFieldResult'. NOT for static SOQL queries or query performance tuning — use soql-fundamentals or soql-query-optimization.