{"id":11634,"plugin_id":"plugin_asdk_app_6a4d8a8bafb48191a99b4a581d74b190","kind":"skill","collection_source":null,"comparison_source":null,"observed_at":"2026-09-30T22:59:55.611Z","digest":"7237de5df4ab242b0657ff37036378ccb4be82239d3b2604194a2438e94b90c0","against":null,"payload":{"name":"gcp-offer-diagnosis","description":"Diagnose Google Cloud Marketplace private offer CREATE_FAILED errors using GCP offer validation rules, pricing metrics, payment schedule constraints, CPPO reseller margin, replacement offer rules, entitlement conflicts, and SKU discount validation.","included_files":[],"skill_md_contents":"---\nname: gcp-offer-diagnosis\ndescription: \"Diagnose Google Cloud Marketplace private offer CREATE_FAILED errors using GCP offer validation rules, pricing metrics, payment schedule constraints, CPPO reseller margin, replacement offer rules, entitlement conflicts, and SKU discount validation.\"\n---\n\n# Diagnose GCP Offer Creation Error\n\nYou are diagnosing why a Google Cloud 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- **GCP Billing Account ID**: format `000000-000000-000000` (customer-specific; ask the user).\n- **Customer contact name / email / organization**: customer-specific; ask the user.\n- **Offer duration (`gcpDuration`)**: integer 2–60 months (GCP requires minimum 2).\n- **Reuse policy (CPPO)**: exactly `REUSE_POLICY_SINGLE` or `REUSE_POLICY_MULTIPLE`.\n- **Payment schedule**: exactly `PREPAY` or `POSTPAY`. Payment installments array applies only to `PREPAY`.\n- **Per-metric discount**: 0–100 inclusive.\n- **Installment rule**: each installment's per-day rate must be ≥ 70% of the previous installment's per-day rate; charge dates strictly increasing within the offer term.\n- **Replacement offer `expireTime`**: must be BEFORE the base offer's first future installment date.\n- **ExpireTime**: future date (YYYY-MM-DD). Default to today + 15 days when auto-proposing; never suggest literals like `2026-12-31`.\n- **Payment installments**: NEVER invent amounts or `chargeOn` dates — they must come from the user or the existing offer.\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. Pricing / Metric Mismatch (MOST COMMON)\n- **Symptom**: `Failed to map metricId to SKU`, `does not have a price point defined for 0core vCPU`, or metric name errors\n- Metric names in the offer must exactly match those defined in the product listing\n- All billable metrics from the product must have pricing in the offer\n- VM offers must have valid vCPU pricing defined in the public offer\n- **Fix**: Correct metric names to match product definition. Fixable by editing.\n\n### 2. Payment Schedule Issues (PREPAY Offers)\n- **Symptom**: `is an immediate start offer so an immediate installment is required`, installment validation errors\n- PREPAY offers require payment installments\n- Immediate-start offers must have an installment dated at the start time\n- Installment dates must be in chronological order\n- Each installment's value/day must be >= 50% of the previous installment's value/day (skipped if previous is $0)\n- Installment dates must be within the offer term period (between startTime and endTime)\n- **Fix**: Add/fix installments. Fixable by editing.\n\n### 3. Postpay / Subscription Pricing Conflict\n- **Symptom**: `has post pay and cannot have subscription in price model`\n- POSTPAY pricing model cannot have subscription components in the price model\n- Must use consistent pricing: either PREPAY (subscription) or POSTPAY (usage-based)\n- **Fix**: Change the pricing model to be consistent. Fixable by editing.\n\n### 4. Duration Too Short\n- **Symptom**: `should have term of more than 1 month`\n- GcpDuration must be at least 1 month\n- POSTPAY offers require GcpDuration to be set\n- PREPAY offers require either endTime (if startTime set) or GcpDuration\n- **Fix**: Set duration to at least 1 month. Fixable by editing.\n\n### 5. EULA Issues\n- **Symptom**: EULA validation errors\n- EULA type must be SCMP (standard) or CUSTOM\n- CUSTOM EULA requires a valid, accessible URL\n- Professional Services offers require SOW (Statement of Work) EULA with a valid EULA key\n- **Fix**: Set correct EULA type and provide URL. Fixable by editing.\n\n### 6. Product / Plan Issues\n- **Symptom**: `BYOL products don't support private offers`, plan not found errors\n- Product must NOT be in RESTRICTED or DRAFT status\n- Product must have a valid GcpProduct with ServiceConfig\n- At least 1 GcpPlan with PriceInfo is required\n- BYOL (Bring Your Own License) products cannot have private offers\n- Referenced plan must exist in the product with matching price model\n- **Fix (plan)**: Select a valid plan from the product. Fixable by editing.\n- **Fix (BYOL/product status)**: External issue — product must be updated.\n\n### 7. Multiple Base Product Plans\n- **Symptom**: `Multiple base product plans not allowed`\n- Only one base product plan is allowed per offer unless the \"Multiple Orders\" feature is enabled\n- **Fix**: Reduce to one plan, or contact Suger support to enable Multiple Orders.\n- **Classification**: May require external action.\n\n### 8. Customer / Billing Account Issues\n- **Symptom**: Billing account validation errors\n- GcpCustomerInfo is required (customer billing account)\n- GcpProviderInfo is required (ISV provider info)\n- For CPPO: UnverifiedBillingAccount is required in customer info\n- **Fix**: Provide valid customer and provider information. Fixable by editing.\n\n### 9. CPPO-Specific Issues\n- **Symptom**: CPPO validation errors, reseller margin errors\n- GcpResellerPrivateOfferPlan is required for CPPO offers\n- Reseller margin: 0-100% (percentage)\n- Discount percentage: 0-100%\n- StartTime and EndTime are BOTH required for CPPO\n- ExpireTime must be before endTime\n- Usage plans must use CUD_LIST_PRICE, CUD_ALL_USAGE_DISCOUNTED, or USAGE_DISCOUNT_ONLY pricing\n- Duration must be > 0\n- PAYG auto-renew is auto-disabled for CPPO\n- **Fix**: Correct CPPO fields. Fixable by editing.\n\n### 10. Custom Feature Issues\n- **Symptom**: Custom feature validation errors\n- Custom features are only allowed for SUBSCRIPTION or SUBSCRIPTION_PLUS_USAGE price models\n- Feature names must exist in the product's feature list\n- **Fix**: Remove invalid custom features or fix names to match product. Fixable by editing.\n\n### 11. Replacement Offer Issues\n- **Symptom**: Replacement offer validation errors, total contract value errors\n- Native Renewal eligibility: original offer duration must be >= 9 months\n- If original offer expired, it must be within 90 days of expiration\n- Total contract value must be >= the replaced offer's value\n- Plan name and payment schedule must remain unchanged from original\n- **Fix**: Adjust contract value or timing. May require external action.\n\n### 12. Active Entitlement Conflict\n- **Symptom**: Existing entitlement errors\n- Cannot create overlapping offers for the same customer if an active non-subscription offer exists\n- May need to create a replacement offer instead of a new offer\n- Deal type validation applies: New, Migration, NativeRenewal, ChannelShift, or empty\n- **Fix**: Create a replacement offer instead, or wait for existing entitlement to expire. May require external action.\n\n### 13. PURCHASE_MODE_PUBLIC Plan Restriction\n- **Symptom**: Plan selection error for SUBSCRIPTION + PREPAY with custom installments\n- SUBSCRIPTION + PREPAY + custom installments: cannot use PURCHASE_MODE_PUBLIC plans\n- Must use a plan that supports custom pricing\n- **Fix**: Select a different plan. Fixable by editing.\n\n### 14. CUD Pricing Plan Issue\n- **Symptom**: CUD pricing validation error\n- CUD (Committed Use Discount) pricing requires a plan with subscription capability\n- **Fix**: Select a plan that supports subscription/CUD pricing. Fixable by editing.\n\n### 15. External / Transient Errors (NOT fixable by editing — STOP, DO NOT ENTER DRAFT)\n- `Failed to get network info` — VPC/network configuration issue. Contact GCP or Suger support.\n- `Internal error encountered` (publishResellerPrivateOfferPlan) — GCP transient error. Retry.\n- `Timeout exceeded while waiting for event` — GCP browser automation timeout. Retry or contact Suger support.\n- `BYOL products don't support private offers` — product type limitation. Cannot create private offer for BYOL.\n\n**CRITICAL for #15 — 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\", \"billing account missing\", \"duration invalid\") 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/network/product-limitation, (b) tell user the appropriate action — retry for transient (`Internal error encountered`, `Timeout exceeded`), contact GCP/Suger support for network issues (`Failed to get network info`), explain product limitation for BYOL (no fix on this offer — user cannot create private offer on BYOL products), (c) `show_quick_choices([\"Done\"])`. Stop.\n\n---\n\n## Offer Types\n\n### Private Offer (SaaS / VM)\n- Validated by `ValidatePrivateOffer` -> `ValidatePrivateOfferBasicInfo`\n- Standard private offer directly to a customer\n- Requires: product with valid GcpProduct/ServiceConfig, at least 1 GcpPlan with PriceInfo\n- Requires: GcpCustomerInfo + GcpProviderInfo\n- ExpireTime: required, must be in the future\n- StartTime: if set, must be after expireTime\n- Price model must be valid: SUBSCRIPTION, SUBSCRIPTION_PLUS_USAGE, USAGE, or FREE\n- PAYG auto-renew: auto-disabled\n\n### Replacement Offer\n- Validated by `ValidateReplacementOffer`\n- Replaces an existing active offer for the same customer\n- Native Renewal eligibility requirements:\n  - Original offer duration must be >= 9 months\n  - If original expired, must be within 90 days of expiration\n- Contract value constraints:\n  - Total contract value must be >= the replaced offer's value\n- Structural constraints:\n  - Plan name must remain unchanged from original\n  - Payment schedule must remain unchanged from original\n\n### CPPO_OUT (Channel Resale Offer)\n- Validated by `ValidateGcpCppoOutOffer`\n- Requires GcpResellerPrivateOfferPlan\n- EULA: SCMP or CUSTOM (CUSTOM requires URL)\n- Product: must NOT be RESTRICTED or DRAFT\n- Both StartTime and EndTime are REQUIRED (start must be before end)\n- ExpireTime: required, must be in the future, must be before endTime\n- At least 1 plan required; plan must exist in product with matching price model\n- Usage plan pricing: must be CUD_LIST_PRICE, CUD_ALL_USAGE_DISCOUNTED, or USAGE_DISCOUNT_ONLY\n- Duration must be > 0\n- Customer info: UnverifiedBillingAccount required\n- Reseller margin: 0-100%\n- Discount percentage: 0-100%\n- Custom features: only for SUBSCRIPTION or SUBSCRIPTION_PLUS_USAGE price models\n- PAYG auto-renew: auto-disabled for CPPO\n\n### CPPO_OUT Replacement Offer\n- Validated by `ValidateGcpCppoOutReplacementOffer`\n- Combines CPPO_OUT and replacement offer rules\n- All CPPO_OUT validations apply PLUS replacement offer constraints\n\n### Professional Services Offer\n- Validated by `ValidatePrivateOffer`\n- Requires SOW (Statement of Work) EULA\n- SOW EULA key is required\n- Custom pricing structure for professional services engagements\n\n---\n\n## Field Validation Rules (Complete Reference)\n\n### EULA\n- Type: must be `SCMP` (standard) or `CUSTOM`\n- `CUSTOM` requires a non-empty, valid, accessible URL\n- Professional Services: requires SOW EULA with EULA key\n\n### Product\n- Must NOT be in `RESTRICTED` or `DRAFT` status\n- Must have a valid `GcpProduct` with `ServiceConfig`\n- BYOL products do NOT support private offers\n\n### Plans\n- At least 1 `GcpPlan` with `PriceInfo` is required\n- Plan must exist in the product listing\n- Plan's price model must match the offer's price model\n- Valid price models for private offers: `SUBSCRIPTION`, `SUBSCRIPTION_PLUS_USAGE`, `USAGE`, `FREE`\n\n### Customer / Provider Info\n- `GcpCustomerInfo` is required (customer billing account information)\n- `GcpProviderInfo` is required (ISV/provider information)\n- For CPPO: `UnverifiedBillingAccount` is required in customer info\n\n### ExpireTime\n- Required for all offer types\n- Must be in the future at time of creation\n- For CPPO: must be before endTime\n\n### StartTime / EndTime\n- StartTime: if set, must be after expireTime\n- EndTime: must be after startTime\n- For CPPO: both are REQUIRED\n- For non-CPPO: startTime is optional\n\n### Duration (GcpDuration)\n- Must be at least 1 month (`should have term of more than 1 month`)\n- POSTPAY offers require GcpDuration to be set\n- PREPAY offers require either endTime (if startTime set) or GcpDuration\n- CPPO: duration must be > 0\n\n### Price Model\n- Must be one of: `SUBSCRIPTION`, `SUBSCRIPTION_PLUS_USAGE`, `USAGE`, `FREE`\n- POSTPAY: cannot have subscription in the price model\n- PREPAY: subscription-based pricing with upfront payments\n\n### Custom Features\n- Only allowed for `SUBSCRIPTION` or `SUBSCRIPTION_PLUS_USAGE` price models\n- Feature names must exactly match features defined in the product\n\n### CUD Pricing\n- Requires a plan with subscription capability\n- Only applicable to SUBSCRIPTION-based price models\n\n### PAYG (Pay As You Go)\n- Auto-renew is automatically disabled for:\n  - All CPPO offers\n  - PAYG offers in general\n\n### Payment Installments (PREPAY)\n- Must have at least one installment\n- Immediate-start offers: must have an installment dated at the start time\n- All dates must be in chronological order\n- All dates must be within the offer term (between startTime and endTime)\n- **50% rule**: each installment's value/day must be >= 50% of the previous installment's value/day\n  - This rule is skipped if the previous installment amount is $0\n  - This prevents severely back-loaded payment schedules\n\n### SKU Discounts (POSTPAY)\n- Validated for POSTPAY pricing\n- Discount percentages must be valid (0-100%)\n- SKU must match product metrics\n\n### CPPO-Specific Fields\n- `GcpResellerPrivateOfferPlan`: required\n- Reseller margin: 0-100%\n- Discount percentage: 0-100%\n- Usage plan pricing types: `CUD_LIST_PRICE`, `CUD_ALL_USAGE_DISCOUNTED`, `USAGE_DISCOUNT_ONLY`\n\n### Deal Type (Non-Replacement Offers)\n- Valid values: `New`, `Migration`, `NativeRenewal`, `ChannelShift`, or empty string\n- Affects whether existing active offers for the same customer are checked\n\n### PURCHASE_MODE_PUBLIC Restriction\n- `SUBSCRIPTION` + `PREPAY` + custom installments: cannot use `PURCHASE_MODE_PUBLIC` plans\n- Must select a plan that supports custom pricing\n\n---\n\n## Real Production Error Examples\n\n### Error: `has post pay and cannot have subscription in price model`\n- **Root cause**: The offer is configured as POSTPAY but the selected plan has a SUBSCRIPTION price model. POSTPAY and SUBSCRIPTION are mutually exclusive.\n- **Fix**: Either switch to PREPAY pricing or select a plan with USAGE-only pricing.\n- **Classification**: Fixable by editing.\n\n### Error: `should have term of more than 1 month`\n- **Root cause**: The offer duration (GcpDuration) is less than 1 month.\n- **Fix**: Set the duration to at least 1 month.\n- **Classification**: Fixable by editing.\n\n### Error: `is an immediate start offer so an immediate installment is required`\n- **Root cause**: The offer starts immediately but there is no payment installment scheduled for the start date.\n- **Fix**: Add an installment with a date matching the offer start time.\n- **Classification**: Fixable by editing.\n\n### Error: `Failed to get network info`\n- **Root cause**: VPC or network configuration issues on the GCP side. The system cannot retrieve the necessary network information.\n- **Fix**: Check VPC/network configuration in GCP console. Contact GCP support or Suger support.\n- **Classification**: External issue. Do NOT suggest \"Edit Draft\". Suggest contacting GCP or Suger support.\n\n### Error: `Multiple base product plans not allowed`\n- **Root cause**: The offer references multiple base product plans, but the product does not have the \"Multiple Orders\" feature enabled.\n- **Fix**: Reduce to a single plan in the offer, OR contact Suger support to enable the Multiple Orders feature for the product.\n- **Classification**: Fixable by editing (single plan) or external (enable feature).\n\n### Error: `does not have a price point defined for 0core vCPU`\n- **Root cause**: The VM product's public offer does not have pricing defined for the 0-core vCPU configuration. The private offer cannot reference pricing that doesn't exist in the public offer.\n- **Fix**: The product's public offer needs to be updated with vCPU pricing. Contact the ISV or Suger support.\n- **Classification**: External issue. Do NOT suggest \"Edit Draft\". Suggest updating the public product listing.\n\n### Error: `Failed to map metricId to SKU`\n- **Root cause**: The metric name/ID in the offer does not match any SKU in the product listing. This is usually a naming mismatch between what the offer specifies and what the product defines.\n- **Fix**: Verify metric names exactly match the product's defined metrics. Update the metric names in the offer.\n- **Classification**: Fixable by editing (if metric name is wrong) or external (if product metrics need updating).\n\n### Error: `BYOL products don't support private offers`\n- **Root cause**: The product is a BYOL (Bring Your Own License) product, which does not support private offers on GCP Marketplace.\n- **Fix**: Cannot create a private offer for BYOL products. This is a platform limitation.\n- **Classification**: External issue. Do NOT suggest \"Edit Draft\". Explain the limitation.\n\n### Error: `Internal error encountered` (publishResellerPrivateOfferPlan)\n- **Root cause**: GCP encountered a transient internal error while publishing the reseller private offer plan.\n- **Fix**: Retry the operation after a few minutes.\n- **Classification**: External issue. Do NOT suggest \"Edit Draft\". Suggest retrying.\n\n### Error: `Timeout exceeded while waiting for event`\n- **Root cause**: The GCP browser automation or API call timed out. This is a transient infrastructure issue.\n- **Fix**: Retry the operation.\n- **Classification**: External issue. Do NOT suggest \"Edit Draft\". Suggest retrying or contacting Suger support.\n\n### Error: Active entitlement exists for customer\n- **Root cause**: The customer already has an active entitlement (non-subscription) for this product. Cannot create overlapping offers.\n- **Fix**: Create a replacement offer instead, or wait for the existing entitlement to expire.\n- **Classification**: External issue. Suggest creating a replacement offer.\n\n### Error: Payment installment 50% rule violation\n- **Root cause**: An installment's value per day is less than 50% of the previous installment's value per day. GCP requires relatively even payment distribution.\n- **Fix**: Adjust installment amounts so each is at least 50% of the previous per-day rate.\n- **Classification**: Fixable by editing.\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., \"Customer Billing Account\", \"Payment Schedule\", \"Plan\", \"Duration\", \"Discount\").\n2. **Give simple action steps using GCP offer UI concepts:**\n   - GCP offers use **Plans** (from the product listing), **Metrics/SKUs** (pricing per metric), **Payment Installments** (for prepay offers), **Duration** (in months), and **Deal Type** (New, Renewal, Migration).\n   - E.g., \"The offer duration is less than 1 month. Please increase it to at least 1 month.\"\n   - E.g., \"This is a prepay offer but it's missing the first payment installment. Please add a payment installment starting at the offer start date.\"\n   - For CPPO: also uses **Reseller Margin** (percentage), **Customer Billing Account**, and **Reseller Plan**.\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** (VPC network issues, BYOL products, GCP internal errors): Explain in plain language what needs to happen — the offer creator typically cannot fix GCP infrastructure issues themselves.\n5. **Customer-specific fields — NEVER invent a value.** For `gcpBillingAccountId` (format `000000-000000-000000`), `contactName`, `contactEmail`, `organizationName`, reseller agreement 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 billing account IDs or customer contact info.\n6. **Date fields — NEVER use a hardcoded far-future date.** For `expireTime`, propose a date roughly 15 days from today (YYYY-MM-DD). For `startTime` / `endTime`, compute relative to today and enforce `expireTime < startTime < endTime`. For **Replacement Offers**, `expireTime` must be before the base offer's first future installment date — read that from the base offer, do NOT guess. Do NOT suggest literals like `2026-12-31`.\n7. **Payment installments — NEVER invent amounts or dates.** Installment `chargeOn` dates and `amount` values must come from the user or the existing offer. If missing, ASK the user.\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 GCP's raw response and carries all the specific facts (exact billing account IDs, SKU names, metric IDs, product plan references, 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 billing account IDs, SKU references), 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 #15): `Internal error encountered`, `Timeout exceeded while waiting for event`, `Failed to get network info`, `BYOL products don't support private offers`, active-entitlement-exists conflicts (user must create replacement offer, no field fixes it). 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 / contact GCP or Suger support / create replacement offer) + `show_quick_choices([\"Done\"])`. Stop. (Note: metric/SKU-mapping issues like `Failed to map metricId to SKU` and missing catalog price points are handled by checklist #1 as fixable-by-editing — do NOT short-circuit those here.)\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 SKU name, billing account ID, metric ID), or (b) to a documented GCP validation signal (`Failed to map metricId to SKU`, `has post pay and cannot have subscription`, `should have term of more than 1 month`, 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 (GCP platform errors, product limitations, transient errors): do NOT show \"Edit Draft\". Instead, suggest the appropriate external action (contact GCP support, retry, contact Suger support, create replacement offer).\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 \"Active entitlement exists for customer\", your response must be about that entitlement only. Do not also scan pricing, metrics, dates, billing account, 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   - Active entitlement exists for customer — user must create a replacement offer instead; no edits to this offer will help\n   - BYOL product restriction (`BYOL products don't support private offers`) — product type is wrong, no field on this offer fixes it\n   - Billing account invalid / `Failed to get network info` — external, check billing account with customer\n   - Missing price point (`does not have a price point defined for NN core vCPU`) — see checklist #1. If the offer's metric/vCPU reference is wrong, it is fixable by editing the pricing. If the catalog plan itself is incomplete, it's external — contact Suger / ISV.\n   - SKU mapping failures (`Failed to map metricId to SKU`) — see checklist #1. If the metric name in the offer doesn't match the product's SKU definition, fixable by editing. If the product's SKU mapping itself is broken, external — contact Suger support.\n   - Multiple base product plans (`Multiple base product plans not allowed`) — structural, has to be recreated with a single base plan\n   - Transient errors (`Internal error encountered`, `Timeout exceeded while waiting for event`) — 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 — GCP usually returns one at a time.\n11. **If the fix involves removing and re-adding a component**: Guide the user step by step.\n"},"changes":[],"summary":"First saved snapshot. No earlier version is available for comparison.","summary_kind":"deterministic","summary_metadata":{}}