← SugerCONTENT HISTORY

Update to Suger

Snapshot Sep 30, 2026 · 23:00 UTC · version 1.0.0

Collection source: not recorded for this historical snapshot.

WHAT CHANGED · RULE-BASED ANALYSIS

First saved snapshot

No earlier snapshot is available to establish a change.

Compare saved observations

Download comparison JSON
Full technical diff · 0 changed fields
Full snapshot data
{
  "name": "snowflake-offer-diagnosis",
  "description": "Diagnose Snowflake Marketplace private offer CREATE_FAILED errors using Snowflake offer validation rules, target consumer format, pricing plan validation, terms of service, invoice and access date preferences, and contract type constraints.",
  "included_files": [],
  "skill_md_contents": "---\nname: snowflake-offer-diagnosis\ndescription: \"Diagnose Snowflake Marketplace private offer CREATE_FAILED errors using Snowflake offer validation rules, target consumer format, pricing plan validation, terms of service, invoice and access date preferences, and contract type constraints.\"\n---\n\n# Diagnose Snowflake Offer Creation Error\n\nYou are diagnosing why a Snowflake Marketplace private offer failed to create (CREATE_FAILED). Use the validation rules below as your primary reference. Do NOT guess — match the error against these rules.\n\n## Quick Reference — Hard Constraints (use these exact values; never fabricate)\n\n- **Offer display name (`name`)**: letters, digits, spaces, and underscores ONLY. Hyphens (`-`), dots, slashes, and other special characters reject with `Invalid display_name`. Max 128 chars.\n- **Target customer (`targetCustomer`)**: format `org_name.account_name` (a dot, not a hyphen). Customer-specific; ask the user.\n- **Contract duration (`contractDurationInMonths`)**: integer 1–60 months.\n- **Contract type**: one of `PAY_AS_YOU_GO`, `LIMITED_TIME`, `SUBSCRIPTION` (or inline-plan values `ONE_TIME` / `RECURRING_MONTHLY` / `RECURRING_YEARLY`).\n- **Currency**: always `USD` (Snowflake Marketplace).\n- **ExpireTime**: must be on or after today (YYYY-MM-DD). Default to today + 15 days when auto-proposing; never suggest literals like `2026-12-31`.\n- **`accessStartDatePreference` / `invoiceStartDatePreference`**: enums. `SPECIFIC_DATE` requires the corresponding specific date field to be set.\n- **`accessEndDate`**: should equal `accessStartDate` + `contractDurationInMonths` unless the user explicitly overrides.\n- **Custom terms URL**: must start with `http://` or `https://`; publicly accessible.\n\n## Quick Diagnosis Checklist (Most Common to Least Common)\n\nWork through this checklist in order. Stop as soon as you find the matching root cause.\n\n### 1. Invalid Display Name (MOST COMMON)\n- **Symptom**: `Invalid display_name`\n- Offer name must contain ONLY: letters (a-z, A-Z), digits (0-9), spaces, and underscores\n- Hyphens (`-`) are NOT allowed\n- Special characters, punctuation, and non-ASCII characters are NOT allowed\n- Name must not be empty\n- **Fix**: Remove hyphens and other invalid characters from the offer name. Fixable by editing.\n\n### 2. Invalid Target Consumer Format\n- **Symptom**: Target consumer validation error\n- Format must be `{org_name}.{customer_id}` (e.g., `GCCAIOZ.TUB38362`)\n- Both org_name and customer_id are required\n- Must contain exactly one dot separator\n- **Fix**: Correct the target consumer to match the `ORG.CUSTOMER` format. Fixable by editing.\n\n### 3. Terms of Service / Custom Terms Link Invalid\n- **Symptom**: `custom terms link is not valid`\n- If custom terms of service are specified, the URL must be valid and accessible\n- URL must be well-formed (https:// protocol, valid domain, etc.)\n- URL must be reachable (not 404, not blocked)\n- **Fix**: Provide a valid, accessible URL for the terms of service. Fixable by editing.\n\n### 4. Pricing Plan Issues\n- **Symptom**: Pricing plan validation errors\n- `PricingPlanName` is required and must not be empty\n- `PricingPlanName` must exist in the product's available pricing plans\n- The selected plan must be compatible with the contract type\n- For one-time PricingPlanDetails: `BaseFee` must be > 0, `BillingDurationMonths` must be > 0\n- **Fix**: Select a valid pricing plan from the product. Fixable by editing.\n\n### 5. ExpireTime Issues\n- **Symptom**: ExpireTime validation errors\n- ExpireTime is required for all Snowflake private offers\n- Must be in the future at time of creation\n- **Fix**: Set a valid future expiration date. Fixable by editing.\n\n### 6. Invoice / Access Date Issues\n- **Symptom**: Invoice or access date validation errors\n- `InvoiceStartDatePreference` + `InvoiceStartTime`: validated for consistency\n- `AccessStartDatePreference` + `AccessStartTime` + `AccessEndTime`: validated for consistency\n- PAY_AS_YOU_GO contracts have specific invoice start date rules\n- LIMITED_TIME / SUBSCRIPTION contracts: invoice start date + payment terms validated together\n- **Fix**: Correct date preferences and times. Fixable by editing.\n\n### 7. Contract Type Issues\n- **Symptom**: Contract type or payment term validation errors\n- Supported contract types: `PAY_AS_YOU_GO`, `LIMITED_TIME`, `SUBSCRIPTION`\n- PAY_AS_YOU_GO: specific invoice start date rules apply\n- LIMITED_TIME / SUBSCRIPTION: invoice start date + payment terms must be validated together\n- **Fix**: Verify contract type and ensure all required fields for that type are set. Fixable by editing.\n\n### 8. Discount Validation\n- **Symptom**: Discount validation errors\n- If a discount is present, it must be valid (correct format and within allowed range)\n- Discount must be compatible with the selected pricing plan\n- **Fix**: Correct the discount value. Fixable by editing.\n\n### 9. Product Issues\n- **Symptom**: Product validation errors, product under review\n- ProductID is required and must not be empty\n- Product must exist in the system\n- Product must be a Snowflake product\n- Product must NOT be under review or in DRAFT/RESTRICTED status\n- **Fix (product under review)**: External issue — wait for product approval or contact Snowflake support.\n- **Fix (wrong product)**: Select the correct product. Fixable by editing.\n\n### 10. SnowflakeOffer Object Missing\n- **Symptom**: SnowflakeOffer validation error\n- The `SnowflakeOffer` object is required and must not be nil/empty\n- This is the core offer data structure containing all Snowflake-specific fields\n- **Fix**: Ensure the offer data is properly populated. Usually indicates a form submission issue.\n\n### 11. External / Transient Errors (NOT fixable by editing — STOP, DO NOT ENTER DRAFT)\n- Product under review — Snowflake is reviewing the product. Wait for approval.\n- Snowflake API errors — transient Snowflake platform issues. Retry the operation.\n- Account validation failures — target consumer account may not exist. Contact customer.\n\n**CRITICAL for #11 — STOP rules (violating these creates fake diagnoses):**\n- **DO NOT** call `invoke_action(\"edit_draft_offer\")`. DO NOT suggest `[\"Edit Draft\"]`.\n- **DO NOT** call `get_form_values` to \"double-check\" the draft. The form is not the problem.\n- **DO NOT** invent a field-level issue (e.g. \"pricing plan wrong\", \"display name invalid\", \"discount bad\") to justify entering the draft. If `errorMessages` does not name a specific field, there is no field to fix.\n- Response must be: (a) classify as transient/under-review/customer-side, (b) tell user the appropriate action — retry for Snowflake API transient errors, wait for product approval when under review, ask customer to verify their Snowflake account when account validation fails, (c) `show_quick_choices([\"Done\"])`. Stop.\n\n---\n\n## Offer Types\n\n### PRIVATE Offer (Only Type Supported)\n- Validated by `ValidatePrivateOffer`\n- Offer type MUST be PRIVATE — no other offer types are supported for Snowflake\n- Direct private offer to a specific Snowflake customer\n- Requires: name, productID, expireTime, SnowflakeOffer, targetConsumer, pricingPlanName\n- Target consumer format: `{org_name}.{customer_id}` (e.g., `GCCAIOZ.TUB38362`)\n\n---\n\n## Field Validation Rules (Complete Reference)\n\n### Offer Type\n- Must be `PRIVATE`\n- No other offer types (CPPO_OUT, etc.) are supported for Snowflake\n\n### Offer Name (display_name)\n- Required — must not be empty\n- Allowed characters: letters (a-z, A-Z), digits (0-9), spaces, underscores (`_`)\n- **Forbidden characters**: hyphens (`-`), dots (`.`), slashes, brackets, and ALL other special characters\n- No non-ASCII characters allowed\n- The `Invalid display_name` error is almost always caused by hyphens in the name\n\n### ExpireTime\n- Required for all Snowflake private offers\n- Must be in the future at time of creation\n- Represents the deadline by which the customer must accept the offer\n\n### ProductID\n- Required — must not be empty\n- Must reference an existing product in the system\n- Product must be a Snowflake Marketplace product (not AWS/Azure/GCP)\n- Product must not be in DRAFT, RESTRICTED, or under-review status\n\n### SnowflakeOffer\n- Required — the core Snowflake offer data object must be present and non-nil\n- Contains all Snowflake-specific offer fields (target consumer, pricing, terms, etc.)\n\n### TargetConsumer\n- Format: `{org_name}.{customer_id}`\n- Example: `GCCAIOZ.TUB38362`\n- Both components are required\n- Must contain exactly one dot (`.`) separator\n- The org_name is the Snowflake organization name\n- The customer_id is the Snowflake account identifier within that organization\n\n### InvoiceStartDatePreference + InvoiceStartTime\n- `InvoiceStartDatePreference`: controls when invoicing begins\n- `InvoiceStartTime`: the specific date for invoice start (if applicable)\n- These are validated together for consistency\n- PAY_AS_YOU_GO contracts have specific invoice start date rules\n- LIMITED_TIME / SUBSCRIPTION contracts: invoice start date must align with payment terms\n\n### AccessStartDatePreference + AccessStartTime + AccessEndTime\n- `AccessStartDatePreference`: controls when customer access begins\n- `AccessStartTime`: the specific date for access start (if applicable)\n- `AccessEndTime`: when customer access ends\n- These are validated together for consistency\n- Access times must be logically ordered (start before end)\n\n### TermsOfService\n- Custom terms of service are optional\n- If provided, the custom terms link (URL) must be:\n  - Well-formed (valid URL format with https:// protocol)\n  - Accessible (not returning 404 or blocked)\n- Standard terms do not require a URL\n\n### Contract Types and Their Rules\n\n#### PAY_AS_YOU_GO\n- Usage-based billing — customer pays based on consumption\n- Specific invoice start date rules apply\n- Does not require fixed term length or upfront pricing\n\n#### LIMITED_TIME\n- Fixed-term contract with a defined end date\n- Invoice start date + payment terms are validated together\n- Must have valid term duration\n\n#### SUBSCRIPTION\n- Recurring subscription contract\n- Invoice start date + payment terms are validated together\n- Must have valid subscription period\n\n### PricingPlanName\n- Required — must not be empty\n- Must exactly match one of the product's available pricing plans\n- The plan must be compatible with the selected contract type\n- Case-sensitive matching\n\n### PricingPlanDetails (One-Time Pricing)\n- `BaseFee`: must be > 0 (positive value required)\n- `BillingDurationMonths`: must be > 0 (positive integer required)\n- These are required for one-time pricing configurations\n\n### Discount\n- Optional — only validated if present\n- Must be in valid format and within allowed range\n- Must be compatible with the selected pricing plan\n\n---\n\n## Real Production Error Examples\n\n### Error: `Invalid display_name`\n- **Root cause**: The offer name contains characters that are not allowed. The most common cause is hyphens (`-`) in the name. Snowflake only allows letters, digits, spaces, and underscores.\n- **Example**: Name `\"My-Offer-2024\"` fails because of hyphens. Should be `\"My Offer 2024\"` or `\"My_Offer_2024\"`.\n- **Fix**: Remove all hyphens and other special characters from the offer name. Replace hyphens with spaces or underscores.\n- **Classification**: Fixable by editing.\n\n### Error: `custom terms link is not valid`\n- **Root cause**: The terms of service URL is malformed, uses http instead of https, has an invalid domain, or is not accessible (404, 403, etc.).\n- **Example**: URL `\"http://example.com/terms\"` might fail due to http protocol. Should be `\"https://example.com/terms\"`.\n- **Fix**: Provide a valid, accessible HTTPS URL for the custom terms of service.\n- **Classification**: Fixable by editing (if URL is wrong) or external (if the URL endpoint is down).\n\n### Error: Product under review\n- **Root cause**: The Snowflake product has been submitted for review and is not yet in a publishable/active state. Cannot create private offers for products under review.\n- **Fix**: Wait for the product review to complete. Contact Snowflake support if the review is taking too long.\n- **Classification**: External issue. Do NOT suggest \"Edit Draft\". Suggest waiting for product approval.\n\n### Error: Target consumer format invalid\n- **Root cause**: The target consumer field does not match the required `{org_name}.{customer_id}` format. Missing the dot separator, missing one component, or containing extra dots.\n- **Example**: `\"GCCAIOZ\"` (missing customer_id) or `\"GCCAIOZ-TUB38362\"` (hyphen instead of dot).\n- **Fix**: Set target consumer to `ORG_NAME.CUSTOMER_ID` format.\n- **Classification**: Fixable by editing.\n\n### Error: PricingPlanName not found in product\n- **Root cause**: The pricing plan name specified in the offer does not match any available pricing plan in the product listing. This could be a typo, case mismatch, or the plan was removed from the product.\n- **Fix**: Select a valid pricing plan name from the product's available plans.\n- **Classification**: Fixable by editing.\n\n### Error: ExpireTime in the past\n- **Root cause**: The offer expiration date is set to a date that has already passed.\n- **Fix**: Set the expiration date to a future date.\n- **Classification**: Fixable by editing.\n\n### Error: BaseFee must be greater than zero\n- **Root cause**: The one-time pricing plan has a BaseFee of 0 or negative value.\n- **Fix**: Set BaseFee to a positive value.\n- **Classification**: Fixable by editing.\n\n### Error: BillingDurationMonths must be greater than zero\n- **Root cause**: The billing duration is set to 0 or a negative value.\n- **Fix**: Set BillingDurationMonths to a positive integer.\n- **Classification**: Fixable by editing.\n\n### Error: Invoice start date invalid for PAY_AS_YOU_GO\n- **Root cause**: The invoice start date preference or time does not comply with PAY_AS_YOU_GO contract rules.\n- **Fix**: Adjust the invoice start date to comply with PAY_AS_YOU_GO requirements.\n- **Classification**: Fixable by editing.\n\n### Error: Snowflake API transient error\n- **Root cause**: Snowflake's API returned a transient error during offer creation.\n- **Fix**: Retry the operation after a few minutes.\n- **Classification**: External issue. Do NOT suggest \"Edit Draft\". Suggest retrying.\n\n### Error: Target consumer account does not exist\n- **Root cause**: The Snowflake organization or customer account specified in the target consumer does not exist on the Snowflake platform.\n- **Fix**: Verify the org name and customer ID with the customer. Get the correct values.\n- **Classification**: External issue (if account truly doesn't exist) or fixable by editing (if typo).\n\n---\n\n## Communication Rules (IMPORTANT)\n\n**The user is a business person, NOT a developer.** Follow these rules:\n\n1. **NEVER show raw JSON, API error codes, or technical field paths.** Use the UI field labels the user sees on screen (e.g., \"Offer Name\", \"Target Consumer\", \"Pricing Plan\", \"Terms of Service Link\").\n2. **Give simple action steps using Snowflake offer UI concepts:**\n   - Snowflake offers use **Pricing Plans** (from the product), **Target Consumer** (org.account format), **Terms of Service** (custom link), **Contract Type** (Pay-as-you-go, Limited Time, Subscription), and **Discount** (percentage).\n   - E.g., \"The offer name 'TangoCardInc-Q-428353' contains a hyphen which is not allowed in Snowflake. Please change it to use only letters, numbers, spaces, and underscores.\"\n   - E.g., \"The custom terms link is not accessible. Please verify the URL and make sure it points to a publicly available page.\"\n3. **When it's a system/backend bug**: Say \"This appears to be a system issue. Please contact Suger support.\" Do NOT ask for technical data.\n4. **When it's an external issue** (product under review): Explain what needs to happen before the offer can be created.\n5. **Customer-specific fields — NEVER invent a value.** For `targetCustomer` (Snowflake consumer in `org_name.account_name` format), custom terms URL, or any buyer-supplied identifier: ASK the user to provide it in chat, then call `show_quick_choices([\"Apply\", \"Cancel\"])` so the fix can be applied after they respond. Do NOT fabricate Snowflake account identifiers.\n6. **Date fields — NEVER use a hardcoded far-future date.** For `expireTime`, propose a date roughly 15 days from today (YYYY-MM-DD). For `accessStartDate` / `accessEndDate`, `accessEndDate` should equal `accessStartDate` + `contractDurationInMonths`. For `invoiceStartDate` with `SPECIFIC_DATE` preference, derive from the offer start. Do NOT suggest literals like `2026-12-31`.\n7. **Currency is always USD for Snowflake Marketplace.** Do not propose other currencies.\n\n## Workflow\n\n1. Call `get_ui_context` immediately to understand the current page context.\n2. **Read `metaInfo.errorMessages` — this is the authoritative source.** It's Snowflake's raw response and carries all the specific facts (exact consumer account names, pricing plan names, invoice dates, error codes, timestamps). Every recommendation you make must trace back to something in here.\n   - **IGNORE `metaInfo.prettifiedErrorMessages` for diagnosis.** That field is a generic, one-time LLM paraphrase the backend generates for email/Slack notifications. It drops specifics (e.g. exact consumer account names, pricing plan IDs), introduces generic suggestions (\"refer to the documentation\"), and sometimes misses valid fix options the raw error implies. Using it as your basis will give the user a watered-down, less accurate answer than reading the raw error yourself. You may re-read it if the raw error is completely unintelligible, but NEVER copy its language or its suggestion list wholesale.\n3. **FIRST — classify the error before looking at the form.** Scan `errorMessages` for transient/external patterns (see checklist #11): Snowflake API transient errors (look for HTTP numeric codes `500`, `502`, `503`, `504`, `429`; phrases like `Internal Server Error`, `Service Unavailable`, `Bad Gateway`, `Gateway Timeout`, `Too Many Requests`, `timeout`, `timed out`), `Product under review`, target-consumer-account-does-not-exist / account-validation failures. If matched → this is an EXTERNAL issue. Do NOT call `get_form_values`. Do NOT call `invoke_action(\"edit_draft_offer\")`. Do NOT hunt for field-level problems. Output: appropriate external action (retry / wait for approval / ask customer to verify Snowflake account) + `show_quick_choices([\"Done\"])`. Stop.\n4. If a form is available AND the error is NOT transient/external: call `get_form_values`, compare actual field values against the rules above, propose a specific fix using **plain language UI instructions**. Your proposed fix MUST trace back to `errorMessages` — either (a) to a concrete substring/phrase in the raw error (exact target-consumer name, pricing plan name), or (b) to a documented Snowflake validation signal (`PricingPlanName not found`, `custom terms link is not valid`, `Target consumer account does not exist`, etc.) whose fix is listed in the checklist above. If neither applies, you are hallucinating — stop and reclassify as external.\n5. If no form AND the error is fixable: diagnose from the error message + offer data in non-technical terms, then offer `[\"Edit Draft\"]` so the user can correct the field values.\n6. For external issues (Snowflake platform errors, product under review, account doesn't exist): do NOT show \"Edit Draft\". Instead, suggest the appropriate external action (contact Snowflake support, wait for product approval, verify with customer, contact Suger support).\n7. **Use UI field labels, not technical field names.**\n8. **ONLY fix errors described in errorMessages — do NOT report other issues that are not causing the failure.** This rule is strict. If the error is \"Target consumer account does not exist\", your response must be about the consumer account only. Do not also scan pricing plan, dates, discount, custom terms, or any other field for \"while you're at it\" improvements — those extra suggestions are almost always false positives and erode user trust.\n9. **Self-contained errors — stop after matching.** These errors tell you exactly what's wrong; once matched, output the fix and stop diagnosing:\n   - Target consumer account does not exist — user/customer must provide a valid Snowflake account or org name; no other field fixes it\n   - Product under review — wait for Snowflake to approve the listing; no edit helps\n   - Pricing plan not found (`PricingPlanName not found in product`) — the selected plan doesn't exist on the product; user must pick a different plan\n   - Custom terms link invalid (`custom terms link is not valid`) — only the link needs fixing (must be `https://...`); nothing else\n   - Invoice start date invalid for PAY_AS_YOU_GO — date-only fix\n   - Snowflake API transient error — retry, no edits needed\n10. When multiple errors exist in `errorMessages`, address them in the order of the diagnosis checklist above. But multiple errors are rare — Snowflake usually returns one at a time.\n"
}

SHA-256: 923aed16ee6eabfa5161b91b0415e94fe3da9b2d523e1d4dac774154c577803f