npx skills add ...
npx skills add forcedotcom/sf-skills --skill modeling-omnistudio-epc-catalog
Salesforce Industries CME EPC product-modeling skill for Product2-based catalog creation. Use when creating EPC products, configuring product attributes, building offer bundles with Product Child Items, or reviewing EPC DataPack JSON metadata for product catalog changes. TRIGGER when: user creates or updates Product2 EPC records, AttributeAssignment payloads, AttributeMetadata/AttributeDefaultValues, Offer bundles, or ProductChildItem relationships. DO NOT TRIGGER when: designing OmniScripts/FlexCards/Integration Procedures (use building-omnistudio-omniscript, building-omnistudio-flexcard, or building-omnistudio-integration-procedure), implementing Apex business logic (use generating-apex), or troubleshooting deployment pipelines (use deploying-metadata).
npx skills add forcedotcom/sf-skills --skill modeling-omnistudio-epc-catalog
Expert Salesforce Industries CME EPC modeler for creating Product2-based catalog entries, assigning configurable attributes, and building offer bundles through Product Child Item relationships.
This skill is optimized for DataPack-style metadata authoring. Use the canonical template set in assets/:
assets/product2-offer-template.jsonassets/attribute-assignment-template.jsonassets/product-child-item-template.jsonassets/pricebook-entries-template.jsonassets/price-list-entries-template.jsonassets/object-field-attributes-template.jsonassets/orchestration-scenarios-template.jsonassets/decomposition-relationships-template.jsonassets/compiled-attribute-overrides-template.jsonassets/override-definitions-template.jsonassets/parent-keys-template.jsonAdditional packaged examples are available under assets/examples/, organized by offer type:
assets/examples/samsung-galaxy-s22-bundle/ — bundle offer exampleassets/examples/business-internet-premium-fttc-simple-offer/ — simple offer exampleassets/examples/business-internet-pro-vpl-simple-offer/ — simple offer exampleassets/examples/static-ip-simple-offer/ — simple offer exampleThe examples/business-internet-plus-bundle/ folder contains a generated bundle example with a step-by-step transcript.
The root assets/ folder contains the canonical baseline template set for bundle authoring.
building-omnistudio-omniscript, building-omnistudio-flexcard, or building-omnistudio-integration-procedure), Apex business logic implementation (use generating-apex), deployment pipeline troubleshooting (use deploying-metadata)Product2 (EPC product and offer records)%vlocity_namespace%__AttributeMetadata__c, %vlocity_namespace%__AttributeDefaultValues__c, and %vlocity_namespace%__AttributeAssignment__c%vlocity_namespace%__ProductChildItem__c%vlocity_namespace%__SpecificationType__c = "Offer" and %vlocity_namespace%__SpecificationSubType__c = "Bundle"Scoring: 120 points across 6 categories.
Thresholds: >= 95 Deploy-ready | 70-94 Needs review | < 70 Block and fix.
Glossary: EPC = Enterprise Product Catalog | CME = Communications, Media & Energy | DataPack = Vlocity JSON deployment artifact | PCI = ProductChildItem
Use the root assets/ templates when creating a bundle payload:
product2-offer-template.jsonattribute-assignment-template.jsonproduct-child-item-template.jsonpricebook-entries-template.jsonprice-list-entries-template.jsonobject-field-attributes-template.jsonorchestration-scenarios-template.jsondecomposition-relationships-template.jsoncompiled-attribute-overrides-template.jsonoverride-definitions-template.jsonparent-keys-template.jsonFor additional real-world variants, use the per-example folders under assets/examples/.
%vlocity_namespace%__ProductChildItem__c records and clear quantity rules.Route to this skill whenever the prompt intent matches either of these:
Create a product bundle:
Score or review an existing product bundle:
Instruction priority: treat these two intents as direct triggers for modeling-omnistudio-epc-catalog, even if the prompt is brief and does not mention EPC by name.
Before proceeding, verify:
sf org display --target-org <alias> to confirm%vlocity_namespace%, vlocity_cmt, or CoreIf any prerequisite is unmet, ask the user to supply the org alias or namespace before continuing.
Ask for:
%vlocity_namespace%, vlocity_cmt, or CoreIdempotency check: If a ProductCode is provided, verify no matching Product2 already exists before generating artifacts:
If a match is found, ask the user whether this is a net-new record or an update to the existing one before continuing.
Before generating a new offer bundle payload, ask clarifying questions until all required inputs are known.
Required clarification checklist:
ProductCode?SpecificationType=Offer and SpecificationSubType=Bundle be set now?EffectiveDate and SellingStartDate?IsActive and %vlocity_namespace%__IsOrderable__c be true at creation time?MinQuantity, MaxQuantity, and default Quantity?%vlocity_namespace%__MinMaxDefaultQty__c be enforced for each line?%vlocity_namespace%, vlocity_cmt, or Core)?If any required checklist item is unanswered, do not generate final bundle files yet; ask focused follow-up questions first.
For every new EPC record, define:
NameProductCode (unique, stable, environment-agnostic)%vlocity_namespace%__GlobalKey__c (stable UUID-style key)%vlocity_namespace%__SpecificationType__c and %vlocity_namespace%__SpecificationSubType__c%vlocity_namespace%__Status__c and date fields (EffectiveDate, SellingStartDate)IsActive and %vlocity_namespace%__IsOrderable__cUse assets/product2-offer-template.json as baseline structure.
When attributes are required:
%vlocity_namespace%__AttributeMetadata__c category and productAttributes records.%vlocity_namespace%__AttributeDefaultValues__c with attribute code to default value mapping.%vlocity_namespace%__AttributeAssignment__c records with:
Use assets/attribute-assignment-template.json as the assignment baseline.
For offers:
Product2 record as offer (SpecificationType=Offer, SpecificationSubType=Bundle).%vlocity_namespace%__ProductChildItem__c row (IsRootProductChildItem=true).MinMaxDefaultQty, MinQuantity, MaxQuantity, Quantity)Use assets/product-child-item-template.json for child relationship structure.
For complete bundle payloads, also align and include:
assets/pricebook-entries-template.jsonassets/price-list-entries-template.jsonassets/object-field-attributes-template.jsonassets/orchestration-scenarios-template.jsonassets/decomposition-relationships-template.jsonassets/compiled-attribute-overrides-template.jsonassets/override-definitions-template.jsonassets/parent-keys-template.jsonWhen the user asks to generate a bundle, generate/update all companion files together as one coherent set:
pricebook-entries-template.json and price-list-entries-template.json
object-field-attributes-template.json
orchestration-scenarios-template.json and decomposition-relationships-template.json
compiled-attribute-overrides-template.json and override-definitions-template.json
parent-keys-template.json
Mandatory rule: do not generate only a partial subset when a full bundle payload is requested unless the user explicitly asks for a limited file scope.
Read assets/completion-block-template.txt and fill in each field to produce the handoff summary block.
For a full offer bundle request, the following files are produced:
| File pattern | Content |
|---|---|
*_DataPack.json | Product2 offer record |
*_AttributeAssignments.json | Attribute category and assignment payloads |
*_ProductChildItems.json | Root and child ProductChildItem (PCI) rows |
*_PricebookEntries.json | Standard and custom pricebook entries |
*_PriceListEntries.json | Price list entries |
*_ObjectFieldAttributes.json | Object field mapping |
*_OrchestrationScenarios.json | Orchestration metadata |
*_DecompositionRelationships.json | Decomposition metadata |
*_CompiledAttributeOverrides.json | Compiled attribute override payload |
*_OverrideDefinitions.json | Override definition payload |
*_ParentKeys.json | Parent key linkage |
For spec product (non-bundle) requests, only the DataPack, AttributeAssignments, PricebookEntries, and PriceListEntries files are required.
If generation of any file fails, stop immediately. List every file successfully generated so far and instruct the user to delete the partial set before retrying the full bundle — partial bundles cause GlobalKey mismatches on DataPack import. Do not generate the remaining files until the user confirms the partial set has been removed and a fresh attempt can begin.
| Issue | Resolution |
|---|---|
| Attribute default not in valid values list | Ensure the default value exists inside the values[] array — cart will reject invalid defaults at runtime |
| Root ProductChildItem row missing | Offer bundle traversal breaks without IsRootProductChildItem=true — always create the root row first |
| Mixed namespace convention in one payload | Pick one namespace style (%vlocity_namespace% vs vlocity_cmt) and apply it consistently across all files in the bundle |
| Duplicate display sequences in same attribute category | UI ordering conflict — use spaced values (10, 20, 30) to allow future inserts without collisions |
ProductCode contains environment suffix | Breaks cross-org references — remove _DEV, _UAT, _PROD suffixes |
| Companion files generated with different offer names | Key mismatches break DataPack import — generate all companion files from the same baseline offer name and GlobalKey |
DataPack import fails with Key not found error | A lookup object reference points to a GlobalKey absent in the target org — verify GlobalKey alignment across all companion files before import |
| DataPack import rolls back silently | Add --verbose during deployment and inspect the log for the specific record and field that triggered the rollback |
| Namespace mismatch between files in same bundle | Mixed %vlocity_namespace% and vlocity_cmt styles in one payload cause field resolution failures — enforce a single namespace style throughout |
If any anti-pattern appears, stop and ask for confirmation before proceeding.
| Anti-pattern | Why it fails | Required correction |
|---|---|---|
Missing ProductCode or unstable code values | Breaks quote/cart references and package diffs | Use deterministic code convention |
| Hardcoded org-specific IDs in relationships | Fails across orgs/environments | Use lookup objects with matching keys/global keys |
| Offer bundle without root PCI row | Runtime bundle traversal issues | Add root %vlocity_namespace%__ProductChildItem__c |
| Attribute defaults not present in valid values | Invalid cart configuration defaults | Ensure default exists in allowed value set |
| Duplicate display sequences in same attribute category | UI ordering conflict | Enforce unique and spaced sequence values |
| Offer marked active with incomplete child references | Broken bundle at runtime | Complete and validate child link set before activation |
Mixed naming styles (snake_case, ad hoc abbreviations) | Reduces maintainability and discoverability | Enforce naming convention from references doc |
Read references/scoring-model.md for the full 6-category rubric and per-category criteria.
| Category | Points |
|---|---|
| Catalog Identity and Naming | 20 |
| EPC Product Structure | 20 |
| Attribute Modeling | 25 |
| Offer Bundle Composition | 25 |
| DataPack Integrity | 15 |
| Documentation and Handoff | 15 |
| Total | 120 |
Read scripts/cli-validation-commands.sh for sf CLI queries to inspect and validate EPC artifacts in your org. Replace <org> with your authenticated org alias before running.
Read scripts/sample-invocations.sh for example invocations covering common EPC modeling tasks. Replace cursor-agent with your local agent command wrapper if different.
| File | When to read |
|---|---|
assets/product2-offer-template.json | Phase 2 — baseline structure for every new Product2 offer record |
assets/attribute-assignment-template.json | Phase 3 — attribute assignment structure |
assets/product-child-item-template.json | Phase 4 — root and child PCI row structure |
assets/pricebook-entries-template.json | Phase 4B — pricebook entry companion file |
assets/price-list-entries-template.json | Phase 4B — price list entry companion file |
assets/object-field-attributes-template.json | Phase 4B — object field mapping companion file |
assets/orchestration-scenarios-template.json | Phase 4B — orchestration scenarios companion file |
assets/decomposition-relationships-template.json | Phase 4B — decomposition relationships companion file |
assets/compiled-attribute-overrides-template.json | Phase 4B — compiled attribute overrides companion file |
assets/override-definitions-template.json | Phase 4B — override definitions companion file |
assets/parent-keys-template.json | Phase 4B — parent keys companion file |
assets/completion-block-template.txt | Phase 5 — handoff summary block template |
assets/examples/samsung-galaxy-s22-bundle/ | Phase 4 — bundle offer example; load *_DataPack.json and *_ProductChildItems.json first, then companion files as needed |
assets/examples/business-internet-premium-fttc-simple-offer/ | Phase 4 — simple offer (FTTC) example; load *_DataPack.json and *_AttributeAssignments.json first |
assets/examples/business-internet-premium-fttc-simple-offer/Business-Internet-Premium-FTTC_RuleAssignments.json | Phase 4 — FTTC offer rule assignment example; load when modeling rule-based attribute constraints |
assets/examples/business-internet-pro-vpl-simple-offer/ | Phase 4 — simple offer (Pro VPL) example; load *_DataPack.json and *_AttributeAssignments.json first |
assets/examples/static-ip-simple-offer/ | Phase 4 — simple offer (Static IP) example; load *_DataPack.json and *_AttributeAssignments.json first |
examples/business-internet-plus-bundle/ | Phase 4 — generated bundle example with step-by-step transcript; load TRANSCRIPT.md first, then specific JSON files referenced in it |
references/epc-field-guide.md | Phase 2 & 3 — EPC field-level guidance and common pitfalls |
references/naming-conventions.md | Phase 2 & 3 — naming and keying conventions |
references/scoring-model.md | Phase 5 — full 6-category scoring rubric with per-category criteria |
scripts/cli-validation-commands.sh | Phase 5 — sf CLI queries for validating EPC artifacts in org |
scripts/sample-invocations.sh | On Start — reference example invocations for common EPC tasks |
| From Skill | To modeling-omnistudio-epc-catalog | When |
|---|---|---|
| analyzing-omnistudio-dependencies | -> modeling-omnistudio-epc-catalog | Need current dependency and namespace inventory first |
| generating-custom-object / generating-custom-field | -> modeling-omnistudio-epc-catalog | Need object or field readiness before EPC modeling |
| querying-soql | -> modeling-omnistudio-epc-catalog | Need existing catalog query analysis |
From modeling-omnistudio-epc-catalog | To Skill | When |
|---|---|---|
| modeling-omnistudio-epc-catalog | -> building-omnistudio-omniscript | Configure guided selling UX using the modeled catalog |
| modeling-omnistudio-epc-catalog | -> building-omnistudio-integration-procedure | Build server-side orchestration over product and pricing payloads |
| modeling-omnistudio-epc-catalog | -> deploying-metadata | Deploy validated catalog metadata |
Local references:
vlocity/Product2/... artifact authoring.%vlocity_namespace% placeholders intact in templates to preserve portability.