[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-pulumi-provider-upgrade":3,"mdc--dt3hbm-key":33,"related-repo-pulumi-provider-upgrade":1795,"related-org-pulumi-provider-upgrade":1888},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":23,"repoUrl":24,"updatedAt":25,"license":26,"forks":27,"topics":28,"repo":29,"sourceUrl":31,"mdContent":32},"provider-upgrade","upgrade and reconcile Pulumi providers","Upgrade any Pulumi provider to a newer version and reconcile the resulting diff. Use when users want to upgrade or update a provider (including editing package.json, requirements.txt, pyproject.toml, go.mod, or Pulumi.yaml to bump a provider SDK), check for breaking changes before or during an upgrade, fix resources that broke after a provider upgrade, or resolve unexpected replacements, creates, or deletes in a post-upgrade preview. Applies to all providers (aws, azure-native, gcp, kubernetes, aws-native, cloudflare, datadog, etc.) — not just Tier 1. Do NOT use for querying which stacks use what package versions; use skill `package-usage` for cross-stack audits. Do NOT use for general infrastructure tasks.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"pulumi","Pulumi","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fpulumi.png",[12,16,17,20],{"name":13,"slug":14,"type":15},"DevOps","devops","tag",{"name":9,"slug":8,"type":15},{"name":18,"slug":19,"type":15},"Migration","migration",{"name":21,"slug":22,"type":15},"Infrastructure as Code","infrastructure-as-code",63,"https:\u002F\u002Fgithub.com\u002Fpulumi\u002Fagent-skills","2026-06-04T07:58:58.874758",null,4,[],{"repoUrl":24,"stars":23,"forks":27,"topics":30,"description":26},[],"https:\u002F\u002Fgithub.com\u002Fpulumi\u002Fagent-skills\u002Ftree\u002FHEAD\u002Fpulumi\u002Fskills\u002Fprovider-upgrade","---\nname: provider-upgrade\ndescription: >\n  Upgrade any Pulumi provider to a newer version and reconcile the resulting diff. Use when\n  users want to upgrade or update a provider (including editing package.json, requirements.txt,\n  pyproject.toml, go.mod, or Pulumi.yaml to bump a provider SDK), check for breaking changes\n  before or during an upgrade, fix resources that broke after a provider upgrade, or resolve\n  unexpected replacements, creates, or deletes in a post-upgrade preview. Applies to all\n  providers (aws, azure-native, gcp, kubernetes, aws-native, cloudflare, datadog, etc.) — not\n  just Tier 1. Do NOT use for querying which stacks use what package versions; use skill\n  `package-usage` for cross-stack audits. Do NOT use for general infrastructure tasks.\n---\n\n# Upgrading Pulumi Providers\n\n## The Principle\n\nA provider upgrade is a translation, not a change request.\n\nThe user's infrastructure intent hasn't changed - they still want the same bucket, the\nsame function, the same cluster. What changed is how the provider's API expresses that\nintent. Your job is to translate their existing code into the new API so that Pulumi sees\nno difference between what the code says and what already exists.\n\nThere are four layers to keep in mind:\n\n1. **User intent** - what the user wants in the cloud (unchanged during an upgrade)\n2. **Code** - how the program expresses that intent using the provider API (may need updating)\n3. **Pulumi state** - Pulumi's stored representation of what exists (may need reconciliation)\n4. **Real cloud** - the actual infrastructure (should not change during an upgrade)\n\nDuring an upgrade, layers 2 and 3 may need to change so that they continue to correctly\nrepresent the unchanged layers 1 and 4.\n\nA correct translation produces zero diff. The Pulumi engine doesn't have a concept of\n\"upgrade\" - it just compares goal state (your code) against actual state (the state file)\nand reconciles. If the translation is correct, those two states match and nothing happens.\nIf you see a diff, either your translation is wrong, or something beyond a code change is\nneeded (import, alias, manual step). In all cases, the diff is a problem to solve, not a\nconsequence to accept.\n\n## The Core Loop\n\n```mermaid\nflowchart TD\n    A[Bump version] --> B[Run preview with env vars]\n    B --> C{Clean?}\n    C -->|Yes| D[Create PR]\n    C -->|No| E[Diff Checkpoint: categorize every diff]\n    E --> F{Any Category A?}\n    F -->|Yes| G[Fix wrong translations]\n    G --> B\n    F -->|No| H{Any Category B?}\n    H -->|Yes| I[Investigate with toolbox]\n    I --> J[Fix or document]\n    J --> B\n    H -->|No| D\n```\n\n1. **Bump** the provider dependency\n2. **Preview** with required CLI flags\n3. **Diff Checkpoint** - categorize every non-`same` resource (see next section)\n4. **Fix Category A** - code changes that didn't produce `same`\n5. **Investigate Category B** - diffs on resources you didn't change\n6. **Repeat** until clean or remaining diffs are fully investigated\n7. **Create PR** with upgrade summary\n\n---\n\n## The Diff Checkpoint\n\nThis is the most important section. Run this after EVERY preview.\n\nFor each non-`same` resource, answer one question:\n**\"Did any of my code changes affect this resource - directly or indirectly?\"**\n\n\"Directly\" means you edited the resource block itself. \"Indirectly\" means you changed\nsomething that feeds into this resource - a shared variable, an output from another\nresource, a helper function, a default value, or a resource that this one depends on.\nIf your changes could have altered what Pulumi computes for this resource, it's Category A.\n\nThen follow the category that applies.\n\n### Category A: I changed code for this resource\n\nYour code change was supposed to translate the same intent into the new API. If the\nresource shows `same`, your translation is correct. If it shows anything else, your\ntranslation is wrong. Not \"the diff is expected because I changed the code\" - if the\nchange were semantically equivalent, there would be no diff.\n\n**I modified an existing resource and it shows `update`:**\n\nYour rename, restructure, or value adjustment changed the meaning, not just the syntax.\nThe resource would show `same` if the old and new code compiled to the same goal state.\nThe `update` means they don't.\n\nAsk yourself: *\"If this rename were truly equivalent, the resource would show `same`.\nIt doesn't. What is semantically different between my old code and my new code?\"*\n\nCommon causes: the new property name maps to a different underlying field; the value\nshape changed and your conversion lost or added information; a default value changed\nin the new version and you need to explicitly set the old value; additional properties\nnow appear in the diff because the new provider version tracks fields it didn't before\n(these need to be set explicitly to match the current state).\n\nIf the update includes properties you didn't change - new fields appearing, type\nnormalizations (string->number), additional defaults - that's the provider changing what\nit tracks. But if the diff is there, `pulumi up` WILL send those values to the cloud API.\nDon't assume they're no-ops. Investigate each changed property.\n\n**I added a new resource block and it shows `create`:**\n\nDuring an upgrade, a new resource block almost always represents infrastructure that\nalready exists in the cloud. The old provider managed it implicitly (as part of another\nresource); the new provider needs an explicit resource. But the cloud object is already\nthere. Pulumi wants to create NEW infrastructure - that's not what you want.\n\nThe fix is `import`, not `create`. Tell Pulumi to adopt the existing cloud resource.\n\nAsk yourself: *\"What cloud object does this new resource represent? Does it already\nexist? How was it managed before the upgrade?\"*\n\n```typescript\n\u002F\u002F Wrong - creates duplicate infrastructure\nconst stage = new aws.apigateway.Stage(\"prodStage\", { ... });\n\n\u002F\u002F Right - adopts the existing resource\nconst stage = new aws.apigateway.Stage(\"prodStage\", { ... }, {\n    import: \"\u003Crest-api-id>\u002Fprod\",  \u002F\u002F import ID format varies by resource type\n});\n```\n\n**I removed a resource block and it shows `delete`:**\n\nA `delete` in the preview means `pulumi up` will call the provider's Delete API to\ndestroy or unconfigure this cloud resource. This is real destruction - not just state\ncleanup. The cloud infrastructure still exists and is almost certainly still needed.\n\nThis is different from `pulumi state delete`, which removes the resource from Pulumi's\ntracking WITHOUT calling the provider's API. When a resource type is removed in a new\nprovider version, the correct approach is:\n1. `pulumi state delete '\u003Curn>'` - manual step, removes from tracking only\n2. Add replacement resources (if any) with imports - adopts the cloud state under new types\n3. Verify with preview\n\nDo NOT leave a `delete` in the preview and proceed to PR creation. A delete that runs\nvia `pulumi up` will destroy real infrastructure. If the resource must be removed from\nstate, document it as a manual step for the user.\n\nAsk yourself: *\"What cloud infrastructure does this resource manage? If `pulumi up` runs\nthis delete, what gets destroyed or unconfigured?\"*\n\n### Category B: I didn't change code for this resource\n\nThis diff was not caused by your code changes. It comes from the provider version change\nitself - a different default, a changed state representation, or a behavioral difference.\nRead `references\u002Fdiagnostic-toolbox.md` and investigate.\n\nThese diffs might be:\n- **Fixable with code** - set an explicit value for a changed default, add an alias\n- **A documented no-op** - the upgrade guide says it resolves on `pulumi up` without\n  affecting real infrastructure. This classification REQUIRES a citation from the upgrade\n  guide or provider documentation. Your own judgment that \"this looks like a no-op\" is\n  not sufficient - the user is trusting you to distinguish real infrastructure changes\n  from artifacts, and getting it wrong means unexpected changes to their cloud.\n- **Requiring manual steps** - state removal + reimport, documented for the user\n- **Unknown** - present what you've found to the user and ask for guidance\n\n### Category C: Provider version bump\n\nAn `update` on `pulumi:providers:{name}` showing only a version change is the one\nexpected diff. Verify no other properties changed on the provider resource.\n\n### After categorizing\n\n**Completeness check:** Every resource in the preview that shows any non-`same` state\nmust appear in your checkpoint - including resources with `[diff: ...]` annotations,\neven if they don't have an explicit create\u002Fupdate\u002Fdelete marker. If you didn't list it,\nyour checkpoint is incomplete. Go back and categorize the missing resources.\n\n**Evidence requirement for accepted diffs:** If you want to accept any diff as \"OK\"\n(not fix it), you need evidence - whether it's Category A or Category B. \"I believe the\nAPI treats these equivalently\" or \"this looks like state reconciliation\" is not evidence.\nAcceptable evidence: the upgrade guide documents it, a GitHub issue confirms it, or the\nprovider documentation explains the behavior. If you can't find evidence, either fix the\ndiff or flag it to the user.\n\n**Ordering:** Fix all Category A issues before investigating Category B. Your code\ncorrections will change the preview output, so investigating Category B diffs first wastes\neffort. Fix your own mistakes first, re-preview, then look at what remains.\n\n**No `delete` or `replace` in the final preview.** If a delete or replace remains when\nyou're ready to create a PR, stop. A delete means `pulumi up` will destroy cloud\ninfrastructure. A replace means it will destroy and recreate. These are never acceptable\nas \"remaining diffs\" - they must be resolved (via code fix, alias, or documented manual\nsteps) before proceeding.\n\n---\n\n## Hard Rules\n\n### Required CLI flags\n\nUse these flags when running preview. A preview without them can show false diffs\n(phantom tag removals, region additions) that aren't real. Don't interpret a preview\nthat was run without them.\n\n```shell\npulumi preview --refresh --run-program\n```\n\n- `--refresh` refreshes actual cloud state before diffing.\n- `--run-program` runs the Pulumi program during refresh.\n\n### Don't chase deprecations\n\nIf something is deprecated but still works, leave it alone. Migrating to the replacement\nintroduces risk for no benefit. A deprecation warning is acceptable - a diff is not.\n\n```typescript\n\u002F\u002F BAD: migrating deprecated-but-working properties introduces risk\nnew aws.s3.Bucket('bucket');\nnew aws.s3.BucketLogging('bucketLogging', {...});  \u002F\u002F unnecessary migration\n\n\u002F\u002F GOOD: fix only the actual error, leave working code alone\nnew aws.s3.Bucket('bucket', {\n  logging: {...},  \u002F\u002F \"loggings\" renamed to \"logging\" - real breaking change\n  website: {...},  \u002F\u002F deprecated but works - don't touch\n});\n```\n\n### Be minimally invasive\n\nEvery line changed could introduce a regression. Prefer the smallest change that works.\n\n### Do not run pulumi up\n\nProvider upgrades modify source code and need code review before deployment.\nPR -> review -> merge -> deploy via CI\u002FCD.\n\n---\n\n## Getting Started\n\n### 1. Get version information\n\nDetermine the target version from the user's request, the Pulumi Registry, package\nmanager metadata, or the repository's existing dependency constraints.\n\nDefault to the latest stable version if the user hasn't specified a target version.\nIf the user asks which stacks or projects are affected, use skill `package-usage` or\nthe best available package inventory tooling before making changes.\n\n### 2. Update the dependency\n\n- **TypeScript\u002FJavaScript**: `npm install @pulumi\u002F{provider}@^{version}` or `yarn add @pulumi\u002F{provider}@^{version}`\n- **Python**: Update `pyproject.toml` or `requirements.txt` with `pulumi_{provider}>={version}` (underscore, not hyphen), then install\n- **Go**: `go get github.com\u002Fpulumi\u002Fpulumi-{provider}\u002Fsdk\u002Fv{major}@latest`, update all import paths (e.g., `v6` -> `v7`), run `go mod tidy`\n- **.NET**: `dotnet add package Pulumi.{Provider} --version {version}`\n- **Java**: Update `pom.xml` or `build.gradle` dependency version\n- **YAML**: Update provider version in resource options or provider configuration. See https:\u002F\u002Fwww.pulumi.com\u002Fdocs\u002Fiac\u002Flanguages-sdks\u002Fyaml\u002Fyaml-language-reference\u002F#providers-and-provider-versions for examples.\n\nAfter installing, check the actual installed version from the lockfile (package-lock.json,\ngo.sum, etc.) - use these exact versions for schema-tools comparisons.\n\n### 3. Run preview\n\nRun `pulumi preview --refresh --run-program` immediately after updating the dependency.\nDo not research breaking changes first - many upgrades just work, especially minor\nversions.\n\nIf the preview is clean (only the provider version bump), create a PR.\n\n---\n\n## Preview Progress\n\nPreview can fail on the first error and hide others. Fixing one error often reveals new\nerrors. This is normal progress, not a sign that fixes are making things worse.\n\n- **New or different errors** -> progress, continue\n- **Error set shrank** -> progress, continue\n- **Same error persists** -> your fix didn't work, try a different approach\n- **No errors but diffs** -> run the diff checkpoint\n\n---\n\n## Upgrade Summary\n\nOnce the preview is clean (or as clean as possible), present the summary:\n\n```\n## Upgrade Summary: {provider} v{current} -> v{target}\n\n### Code Changes\n| File | Change | Why it preserves intent |\n|------|--------|------------------------|\n| package.json | Version bump | - |\n| index.ts:15 | loggings -> logging | Property renamed, same underlying field |\n\n### Preview Result\nAll resources show `same` except provider version bump.\n{Or: N resources show diffs - see below}\n\n### Remaining Diffs (if any)\n| Resource | Operation | What happens on `pulumi up` | Risk | Source |\n|----------|-----------|---------------------------|------|--------|\n| aws:s3:Bucket (myBucket) | update (-tags) | No-op, state reconciles | None | AWS v7 guide section 3.2 |\n\nEvery remaining diff MUST cite an authoritative source (upgrade guide, provider docs,\nupstream GitHub issue). \"I believe this is expected\" is not a source.\n\n### Manual Steps Required (if any)\n1. `pulumi state delete '\u003Curn>'` - remove old type binding\n2. `pulumi import \u003Ctype> \u003Cname> \u003Cid>` - adopt under new type\n3. `pulumi preview --refresh --run-program` - verify clean\n\n### Deprecation Warnings (no action taken)\n- List deprecated-but-working code left intentionally\n```\n\nIf the preview is clean (or all remaining diffs are documented no-ops with cited sources),\ncreate a pull request. If unresolved diffs remain, present the summary as an exception\nreport and ask the user how they'd like to proceed before creating a PR.\n\n---\n\n## References\n\n- `references\u002Fdiagnostic-toolbox.md` - upgrade guides, schema-tools (install, run,\n  interpret output), stack state inspection, SDK types, GitHub issues. Read when\n  investigating Category B diffs.\n",{"data":34,"body":35},{"name":4,"description":6},{"type":36,"children":37},"root",[38,47,54,60,65,70,116,121,126,132,262,348,352,358,363,380,385,390,397,409,425,444,462,467,480,495,500,520,529,794,809,828,841,865,884,900,906,919,924,975,981,1001,1007,1032,1042,1052,1084,1087,1093,1099,1104,1136,1161,1167,1172,1435,1441,1446,1452,1457,1460,1466,1472,1477,1490,1496,1653,1658,1664,1677,1682,1685,1691,1696,1738,1741,1747,1752,1762,1767,1770,1776,1789],{"type":39,"tag":40,"props":41,"children":43},"element","h1",{"id":42},"upgrading-pulumi-providers",[44],{"type":45,"value":46},"text","Upgrading Pulumi Providers",{"type":39,"tag":48,"props":49,"children":51},"h2",{"id":50},"the-principle",[52],{"type":45,"value":53},"The Principle",{"type":39,"tag":55,"props":56,"children":57},"p",{},[58],{"type":45,"value":59},"A provider upgrade is a translation, not a change request.",{"type":39,"tag":55,"props":61,"children":62},{},[63],{"type":45,"value":64},"The user's infrastructure intent hasn't changed - they still want the same bucket, the\nsame function, the same cluster. What changed is how the provider's API expresses that\nintent. Your job is to translate their existing code into the new API so that Pulumi sees\nno difference between what the code says and what already exists.",{"type":39,"tag":55,"props":66,"children":67},{},[68],{"type":45,"value":69},"There are four layers to keep in mind:",{"type":39,"tag":71,"props":72,"children":73},"ol",{},[74,86,96,106],{"type":39,"tag":75,"props":76,"children":77},"li",{},[78,84],{"type":39,"tag":79,"props":80,"children":81},"strong",{},[82],{"type":45,"value":83},"User intent",{"type":45,"value":85}," - what the user wants in the cloud (unchanged during an upgrade)",{"type":39,"tag":75,"props":87,"children":88},{},[89,94],{"type":39,"tag":79,"props":90,"children":91},{},[92],{"type":45,"value":93},"Code",{"type":45,"value":95}," - how the program expresses that intent using the provider API (may need updating)",{"type":39,"tag":75,"props":97,"children":98},{},[99,104],{"type":39,"tag":79,"props":100,"children":101},{},[102],{"type":45,"value":103},"Pulumi state",{"type":45,"value":105}," - Pulumi's stored representation of what exists (may need reconciliation)",{"type":39,"tag":75,"props":107,"children":108},{},[109,114],{"type":39,"tag":79,"props":110,"children":111},{},[112],{"type":45,"value":113},"Real cloud",{"type":45,"value":115}," - the actual infrastructure (should not change during an upgrade)",{"type":39,"tag":55,"props":117,"children":118},{},[119],{"type":45,"value":120},"During an upgrade, layers 2 and 3 may need to change so that they continue to correctly\nrepresent the unchanged layers 1 and 4.",{"type":39,"tag":55,"props":122,"children":123},{},[124],{"type":45,"value":125},"A correct translation produces zero diff. The Pulumi engine doesn't have a concept of\n\"upgrade\" - it just compares goal state (your code) against actual state (the state file)\nand reconciles. If the translation is correct, those two states match and nothing happens.\nIf you see a diff, either your translation is wrong, or something beyond a code change is\nneeded (import, alias, manual step). In all cases, the diff is a problem to solve, not a\nconsequence to accept.",{"type":39,"tag":48,"props":127,"children":129},{"id":128},"the-core-loop",[130],{"type":45,"value":131},"The Core Loop",{"type":39,"tag":133,"props":134,"children":139},"pre",{"className":135,"code":136,"language":137,"meta":138,"style":138},"language-mermaid shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","flowchart TD\n    A[Bump version] --> B[Run preview with env vars]\n    B --> C{Clean?}\n    C -->|Yes| D[Create PR]\n    C -->|No| E[Diff Checkpoint: categorize every diff]\n    E --> F{Any Category A?}\n    F -->|Yes| G[Fix wrong translations]\n    G --> B\n    F -->|No| H{Any Category B?}\n    H -->|Yes| I[Investigate with toolbox]\n    I --> J[Fix or document]\n    J --> B\n    H -->|No| D\n","mermaid","",[140],{"type":39,"tag":141,"props":142,"children":143},"code",{"__ignoreMap":138},[144,155,164,173,181,190,199,208,217,226,235,244,253],{"type":39,"tag":145,"props":146,"children":149},"span",{"class":147,"line":148},"line",1,[150],{"type":39,"tag":145,"props":151,"children":152},{},[153],{"type":45,"value":154},"flowchart TD\n",{"type":39,"tag":145,"props":156,"children":158},{"class":147,"line":157},2,[159],{"type":39,"tag":145,"props":160,"children":161},{},[162],{"type":45,"value":163},"    A[Bump version] --> B[Run preview with env vars]\n",{"type":39,"tag":145,"props":165,"children":167},{"class":147,"line":166},3,[168],{"type":39,"tag":145,"props":169,"children":170},{},[171],{"type":45,"value":172},"    B --> C{Clean?}\n",{"type":39,"tag":145,"props":174,"children":175},{"class":147,"line":27},[176],{"type":39,"tag":145,"props":177,"children":178},{},[179],{"type":45,"value":180},"    C -->|Yes| D[Create PR]\n",{"type":39,"tag":145,"props":182,"children":184},{"class":147,"line":183},5,[185],{"type":39,"tag":145,"props":186,"children":187},{},[188],{"type":45,"value":189},"    C -->|No| E[Diff Checkpoint: categorize every diff]\n",{"type":39,"tag":145,"props":191,"children":193},{"class":147,"line":192},6,[194],{"type":39,"tag":145,"props":195,"children":196},{},[197],{"type":45,"value":198},"    E --> F{Any Category A?}\n",{"type":39,"tag":145,"props":200,"children":202},{"class":147,"line":201},7,[203],{"type":39,"tag":145,"props":204,"children":205},{},[206],{"type":45,"value":207},"    F -->|Yes| G[Fix wrong translations]\n",{"type":39,"tag":145,"props":209,"children":211},{"class":147,"line":210},8,[212],{"type":39,"tag":145,"props":213,"children":214},{},[215],{"type":45,"value":216},"    G --> B\n",{"type":39,"tag":145,"props":218,"children":220},{"class":147,"line":219},9,[221],{"type":39,"tag":145,"props":222,"children":223},{},[224],{"type":45,"value":225},"    F -->|No| H{Any Category B?}\n",{"type":39,"tag":145,"props":227,"children":229},{"class":147,"line":228},10,[230],{"type":39,"tag":145,"props":231,"children":232},{},[233],{"type":45,"value":234},"    H -->|Yes| I[Investigate with toolbox]\n",{"type":39,"tag":145,"props":236,"children":238},{"class":147,"line":237},11,[239],{"type":39,"tag":145,"props":240,"children":241},{},[242],{"type":45,"value":243},"    I --> J[Fix or document]\n",{"type":39,"tag":145,"props":245,"children":247},{"class":147,"line":246},12,[248],{"type":39,"tag":145,"props":249,"children":250},{},[251],{"type":45,"value":252},"    J --> B\n",{"type":39,"tag":145,"props":254,"children":256},{"class":147,"line":255},13,[257],{"type":39,"tag":145,"props":258,"children":259},{},[260],{"type":45,"value":261},"    H -->|No| D\n",{"type":39,"tag":71,"props":263,"children":264},{},[265,275,285,303,318,328,338],{"type":39,"tag":75,"props":266,"children":267},{},[268,273],{"type":39,"tag":79,"props":269,"children":270},{},[271],{"type":45,"value":272},"Bump",{"type":45,"value":274}," the provider dependency",{"type":39,"tag":75,"props":276,"children":277},{},[278,283],{"type":39,"tag":79,"props":279,"children":280},{},[281],{"type":45,"value":282},"Preview",{"type":45,"value":284}," with required CLI flags",{"type":39,"tag":75,"props":286,"children":287},{},[288,293,295,301],{"type":39,"tag":79,"props":289,"children":290},{},[291],{"type":45,"value":292},"Diff Checkpoint",{"type":45,"value":294}," - categorize every non-",{"type":39,"tag":141,"props":296,"children":298},{"className":297},[],[299],{"type":45,"value":300},"same",{"type":45,"value":302}," resource (see next section)",{"type":39,"tag":75,"props":304,"children":305},{},[306,311,313],{"type":39,"tag":79,"props":307,"children":308},{},[309],{"type":45,"value":310},"Fix Category A",{"type":45,"value":312}," - code changes that didn't produce ",{"type":39,"tag":141,"props":314,"children":316},{"className":315},[],[317],{"type":45,"value":300},{"type":39,"tag":75,"props":319,"children":320},{},[321,326],{"type":39,"tag":79,"props":322,"children":323},{},[324],{"type":45,"value":325},"Investigate Category B",{"type":45,"value":327}," - diffs on resources you didn't change",{"type":39,"tag":75,"props":329,"children":330},{},[331,336],{"type":39,"tag":79,"props":332,"children":333},{},[334],{"type":45,"value":335},"Repeat",{"type":45,"value":337}," until clean or remaining diffs are fully investigated",{"type":39,"tag":75,"props":339,"children":340},{},[341,346],{"type":39,"tag":79,"props":342,"children":343},{},[344],{"type":45,"value":345},"Create PR",{"type":45,"value":347}," with upgrade summary",{"type":39,"tag":349,"props":350,"children":351},"hr",{},[],{"type":39,"tag":48,"props":353,"children":355},{"id":354},"the-diff-checkpoint",[356],{"type":45,"value":357},"The Diff Checkpoint",{"type":39,"tag":55,"props":359,"children":360},{},[361],{"type":45,"value":362},"This is the most important section. Run this after EVERY preview.",{"type":39,"tag":55,"props":364,"children":365},{},[366,368,373,375],{"type":45,"value":367},"For each non-",{"type":39,"tag":141,"props":369,"children":371},{"className":370},[],[372],{"type":45,"value":300},{"type":45,"value":374}," resource, answer one question:\n",{"type":39,"tag":79,"props":376,"children":377},{},[378],{"type":45,"value":379},"\"Did any of my code changes affect this resource - directly or indirectly?\"",{"type":39,"tag":55,"props":381,"children":382},{},[383],{"type":45,"value":384},"\"Directly\" means you edited the resource block itself. \"Indirectly\" means you changed\nsomething that feeds into this resource - a shared variable, an output from another\nresource, a helper function, a default value, or a resource that this one depends on.\nIf your changes could have altered what Pulumi computes for this resource, it's Category A.",{"type":39,"tag":55,"props":386,"children":387},{},[388],{"type":45,"value":389},"Then follow the category that applies.",{"type":39,"tag":391,"props":392,"children":394},"h3",{"id":393},"category-a-i-changed-code-for-this-resource",[395],{"type":45,"value":396},"Category A: I changed code for this resource",{"type":39,"tag":55,"props":398,"children":399},{},[400,402,407],{"type":45,"value":401},"Your code change was supposed to translate the same intent into the new API. If the\nresource shows ",{"type":39,"tag":141,"props":403,"children":405},{"className":404},[],[406],{"type":45,"value":300},{"type":45,"value":408},", your translation is correct. If it shows anything else, your\ntranslation is wrong. Not \"the diff is expected because I changed the code\" - if the\nchange were semantically equivalent, there would be no diff.",{"type":39,"tag":55,"props":410,"children":411},{},[412],{"type":39,"tag":79,"props":413,"children":414},{},[415,417,423],{"type":45,"value":416},"I modified an existing resource and it shows ",{"type":39,"tag":141,"props":418,"children":420},{"className":419},[],[421],{"type":45,"value":422},"update",{"type":45,"value":424},":",{"type":39,"tag":55,"props":426,"children":427},{},[428,430,435,437,442],{"type":45,"value":429},"Your rename, restructure, or value adjustment changed the meaning, not just the syntax.\nThe resource would show ",{"type":39,"tag":141,"props":431,"children":433},{"className":432},[],[434],{"type":45,"value":300},{"type":45,"value":436}," if the old and new code compiled to the same goal state.\nThe ",{"type":39,"tag":141,"props":438,"children":440},{"className":439},[],[441],{"type":45,"value":422},{"type":45,"value":443}," means they don't.",{"type":39,"tag":55,"props":445,"children":446},{},[447,449],{"type":45,"value":448},"Ask yourself: ",{"type":39,"tag":450,"props":451,"children":452},"em",{},[453,455,460],{"type":45,"value":454},"\"If this rename were truly equivalent, the resource would show ",{"type":39,"tag":141,"props":456,"children":458},{"className":457},[],[459],{"type":45,"value":300},{"type":45,"value":461},".\nIt doesn't. What is semantically different between my old code and my new code?\"",{"type":39,"tag":55,"props":463,"children":464},{},[465],{"type":45,"value":466},"Common causes: the new property name maps to a different underlying field; the value\nshape changed and your conversion lost or added information; a default value changed\nin the new version and you need to explicitly set the old value; additional properties\nnow appear in the diff because the new provider version tracks fields it didn't before\n(these need to be set explicitly to match the current state).",{"type":39,"tag":55,"props":468,"children":469},{},[470,472,478],{"type":45,"value":471},"If the update includes properties you didn't change - new fields appearing, type\nnormalizations (string->number), additional defaults - that's the provider changing what\nit tracks. But if the diff is there, ",{"type":39,"tag":141,"props":473,"children":475},{"className":474},[],[476],{"type":45,"value":477},"pulumi up",{"type":45,"value":479}," WILL send those values to the cloud API.\nDon't assume they're no-ops. Investigate each changed property.",{"type":39,"tag":55,"props":481,"children":482},{},[483],{"type":39,"tag":79,"props":484,"children":485},{},[486,488,494],{"type":45,"value":487},"I added a new resource block and it shows ",{"type":39,"tag":141,"props":489,"children":491},{"className":490},[],[492],{"type":45,"value":493},"create",{"type":45,"value":424},{"type":39,"tag":55,"props":496,"children":497},{},[498],{"type":45,"value":499},"During an upgrade, a new resource block almost always represents infrastructure that\nalready exists in the cloud. The old provider managed it implicitly (as part of another\nresource); the new provider needs an explicit resource. But the cloud object is already\nthere. Pulumi wants to create NEW infrastructure - that's not what you want.",{"type":39,"tag":55,"props":501,"children":502},{},[503,505,511,513,518],{"type":45,"value":504},"The fix is ",{"type":39,"tag":141,"props":506,"children":508},{"className":507},[],[509],{"type":45,"value":510},"import",{"type":45,"value":512},", not ",{"type":39,"tag":141,"props":514,"children":516},{"className":515},[],[517],{"type":45,"value":493},{"type":45,"value":519},". Tell Pulumi to adopt the existing cloud resource.",{"type":39,"tag":55,"props":521,"children":522},{},[523,524],{"type":45,"value":448},{"type":39,"tag":450,"props":525,"children":526},{},[527],{"type":45,"value":528},"\"What cloud object does this new resource represent? Does it already\nexist? How was it managed before the upgrade?\"",{"type":39,"tag":133,"props":530,"children":534},{"className":531,"code":532,"language":533,"meta":138,"style":138},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F Wrong - creates duplicate infrastructure\nconst stage = new aws.apigateway.Stage(\"prodStage\", { ... });\n\n\u002F\u002F Right - adopts the existing resource\nconst stage = new aws.apigateway.Stage(\"prodStage\", { ... }, {\n    import: \"\u003Crest-api-id>\u002Fprod\",  \u002F\u002F import ID format varies by resource type\n});\n","typescript",[535],{"type":39,"tag":141,"props":536,"children":537},{"__ignoreMap":138},[538,547,648,657,665,742,778],{"type":39,"tag":145,"props":539,"children":540},{"class":147,"line":148},[541],{"type":39,"tag":145,"props":542,"children":544},{"style":543},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[545],{"type":45,"value":546},"\u002F\u002F Wrong - creates duplicate infrastructure\n",{"type":39,"tag":145,"props":548,"children":549},{"class":147,"line":157},[550,556,562,568,573,578,583,588,592,598,603,608,614,618,623,628,633,638,643],{"type":39,"tag":145,"props":551,"children":553},{"style":552},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[554],{"type":45,"value":555},"const",{"type":39,"tag":145,"props":557,"children":559},{"style":558},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[560],{"type":45,"value":561}," stage ",{"type":39,"tag":145,"props":563,"children":565},{"style":564},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[566],{"type":45,"value":567},"=",{"type":39,"tag":145,"props":569,"children":570},{"style":564},[571],{"type":45,"value":572}," new",{"type":39,"tag":145,"props":574,"children":575},{"style":558},[576],{"type":45,"value":577}," aws",{"type":39,"tag":145,"props":579,"children":580},{"style":564},[581],{"type":45,"value":582},".",{"type":39,"tag":145,"props":584,"children":585},{"style":558},[586],{"type":45,"value":587},"apigateway",{"type":39,"tag":145,"props":589,"children":590},{"style":564},[591],{"type":45,"value":582},{"type":39,"tag":145,"props":593,"children":595},{"style":594},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[596],{"type":45,"value":597},"Stage",{"type":39,"tag":145,"props":599,"children":600},{"style":558},[601],{"type":45,"value":602},"(",{"type":39,"tag":145,"props":604,"children":605},{"style":564},[606],{"type":45,"value":607},"\"",{"type":39,"tag":145,"props":609,"children":611},{"style":610},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[612],{"type":45,"value":613},"prodStage",{"type":39,"tag":145,"props":615,"children":616},{"style":564},[617],{"type":45,"value":607},{"type":39,"tag":145,"props":619,"children":620},{"style":564},[621],{"type":45,"value":622},",",{"type":39,"tag":145,"props":624,"children":625},{"style":564},[626],{"type":45,"value":627}," {",{"type":39,"tag":145,"props":629,"children":630},{"style":564},[631],{"type":45,"value":632}," ...",{"type":39,"tag":145,"props":634,"children":635},{"style":564},[636],{"type":45,"value":637}," }",{"type":39,"tag":145,"props":639,"children":640},{"style":558},[641],{"type":45,"value":642},")",{"type":39,"tag":145,"props":644,"children":645},{"style":564},[646],{"type":45,"value":647},";\n",{"type":39,"tag":145,"props":649,"children":650},{"class":147,"line":166},[651],{"type":39,"tag":145,"props":652,"children":654},{"emptyLinePlaceholder":653},true,[655],{"type":45,"value":656},"\n",{"type":39,"tag":145,"props":658,"children":659},{"class":147,"line":27},[660],{"type":39,"tag":145,"props":661,"children":662},{"style":543},[663],{"type":45,"value":664},"\u002F\u002F Right - adopts the existing resource\n",{"type":39,"tag":145,"props":666,"children":667},{"class":147,"line":183},[668,672,676,680,684,688,692,696,700,704,708,712,716,720,724,728,732,737],{"type":39,"tag":145,"props":669,"children":670},{"style":552},[671],{"type":45,"value":555},{"type":39,"tag":145,"props":673,"children":674},{"style":558},[675],{"type":45,"value":561},{"type":39,"tag":145,"props":677,"children":678},{"style":564},[679],{"type":45,"value":567},{"type":39,"tag":145,"props":681,"children":682},{"style":564},[683],{"type":45,"value":572},{"type":39,"tag":145,"props":685,"children":686},{"style":558},[687],{"type":45,"value":577},{"type":39,"tag":145,"props":689,"children":690},{"style":564},[691],{"type":45,"value":582},{"type":39,"tag":145,"props":693,"children":694},{"style":558},[695],{"type":45,"value":587},{"type":39,"tag":145,"props":697,"children":698},{"style":564},[699],{"type":45,"value":582},{"type":39,"tag":145,"props":701,"children":702},{"style":594},[703],{"type":45,"value":597},{"type":39,"tag":145,"props":705,"children":706},{"style":558},[707],{"type":45,"value":602},{"type":39,"tag":145,"props":709,"children":710},{"style":564},[711],{"type":45,"value":607},{"type":39,"tag":145,"props":713,"children":714},{"style":610},[715],{"type":45,"value":613},{"type":39,"tag":145,"props":717,"children":718},{"style":564},[719],{"type":45,"value":607},{"type":39,"tag":145,"props":721,"children":722},{"style":564},[723],{"type":45,"value":622},{"type":39,"tag":145,"props":725,"children":726},{"style":564},[727],{"type":45,"value":627},{"type":39,"tag":145,"props":729,"children":730},{"style":564},[731],{"type":45,"value":632},{"type":39,"tag":145,"props":733,"children":734},{"style":564},[735],{"type":45,"value":736}," },",{"type":39,"tag":145,"props":738,"children":739},{"style":564},[740],{"type":45,"value":741}," {\n",{"type":39,"tag":145,"props":743,"children":744},{"class":147,"line":192},[745,751,755,760,765,769,773],{"type":39,"tag":145,"props":746,"children":748},{"style":747},"--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178",[749],{"type":45,"value":750},"    import",{"type":39,"tag":145,"props":752,"children":753},{"style":564},[754],{"type":45,"value":424},{"type":39,"tag":145,"props":756,"children":757},{"style":564},[758],{"type":45,"value":759}," \"",{"type":39,"tag":145,"props":761,"children":762},{"style":610},[763],{"type":45,"value":764},"\u003Crest-api-id>\u002Fprod",{"type":39,"tag":145,"props":766,"children":767},{"style":564},[768],{"type":45,"value":607},{"type":39,"tag":145,"props":770,"children":771},{"style":564},[772],{"type":45,"value":622},{"type":39,"tag":145,"props":774,"children":775},{"style":543},[776],{"type":45,"value":777},"  \u002F\u002F import ID format varies by resource type\n",{"type":39,"tag":145,"props":779,"children":780},{"class":147,"line":201},[781,786,790],{"type":39,"tag":145,"props":782,"children":783},{"style":564},[784],{"type":45,"value":785},"}",{"type":39,"tag":145,"props":787,"children":788},{"style":558},[789],{"type":45,"value":642},{"type":39,"tag":145,"props":791,"children":792},{"style":564},[793],{"type":45,"value":647},{"type":39,"tag":55,"props":795,"children":796},{},[797],{"type":39,"tag":79,"props":798,"children":799},{},[800,802,808],{"type":45,"value":801},"I removed a resource block and it shows ",{"type":39,"tag":141,"props":803,"children":805},{"className":804},[],[806],{"type":45,"value":807},"delete",{"type":45,"value":424},{"type":39,"tag":55,"props":810,"children":811},{},[812,814,819,821,826],{"type":45,"value":813},"A ",{"type":39,"tag":141,"props":815,"children":817},{"className":816},[],[818],{"type":45,"value":807},{"type":45,"value":820}," in the preview means ",{"type":39,"tag":141,"props":822,"children":824},{"className":823},[],[825],{"type":45,"value":477},{"type":45,"value":827}," will call the provider's Delete API to\ndestroy or unconfigure this cloud resource. This is real destruction - not just state\ncleanup. The cloud infrastructure still exists and is almost certainly still needed.",{"type":39,"tag":55,"props":829,"children":830},{},[831,833,839],{"type":45,"value":832},"This is different from ",{"type":39,"tag":141,"props":834,"children":836},{"className":835},[],[837],{"type":45,"value":838},"pulumi state delete",{"type":45,"value":840},", which removes the resource from Pulumi's\ntracking WITHOUT calling the provider's API. When a resource type is removed in a new\nprovider version, the correct approach is:",{"type":39,"tag":71,"props":842,"children":843},{},[844,855,860],{"type":39,"tag":75,"props":845,"children":846},{},[847,853],{"type":39,"tag":141,"props":848,"children":850},{"className":849},[],[851],{"type":45,"value":852},"pulumi state delete '\u003Curn>'",{"type":45,"value":854}," - manual step, removes from tracking only",{"type":39,"tag":75,"props":856,"children":857},{},[858],{"type":45,"value":859},"Add replacement resources (if any) with imports - adopts the cloud state under new types",{"type":39,"tag":75,"props":861,"children":862},{},[863],{"type":45,"value":864},"Verify with preview",{"type":39,"tag":55,"props":866,"children":867},{},[868,870,875,877,882],{"type":45,"value":869},"Do NOT leave a ",{"type":39,"tag":141,"props":871,"children":873},{"className":872},[],[874],{"type":45,"value":807},{"type":45,"value":876}," in the preview and proceed to PR creation. A delete that runs\nvia ",{"type":39,"tag":141,"props":878,"children":880},{"className":879},[],[881],{"type":45,"value":477},{"type":45,"value":883}," will destroy real infrastructure. If the resource must be removed from\nstate, document it as a manual step for the user.",{"type":39,"tag":55,"props":885,"children":886},{},[887,888],{"type":45,"value":448},{"type":39,"tag":450,"props":889,"children":890},{},[891,893,898],{"type":45,"value":892},"\"What cloud infrastructure does this resource manage? If ",{"type":39,"tag":141,"props":894,"children":896},{"className":895},[],[897],{"type":45,"value":477},{"type":45,"value":899}," runs\nthis delete, what gets destroyed or unconfigured?\"",{"type":39,"tag":391,"props":901,"children":903},{"id":902},"category-b-i-didnt-change-code-for-this-resource",[904],{"type":45,"value":905},"Category B: I didn't change code for this resource",{"type":39,"tag":55,"props":907,"children":908},{},[909,911,917],{"type":45,"value":910},"This diff was not caused by your code changes. It comes from the provider version change\nitself - a different default, a changed state representation, or a behavioral difference.\nRead ",{"type":39,"tag":141,"props":912,"children":914},{"className":913},[],[915],{"type":45,"value":916},"references\u002Fdiagnostic-toolbox.md",{"type":45,"value":918}," and investigate.",{"type":39,"tag":55,"props":920,"children":921},{},[922],{"type":45,"value":923},"These diffs might be:",{"type":39,"tag":925,"props":926,"children":927},"ul",{},[928,938,955,965],{"type":39,"tag":75,"props":929,"children":930},{},[931,936],{"type":39,"tag":79,"props":932,"children":933},{},[934],{"type":45,"value":935},"Fixable with code",{"type":45,"value":937}," - set an explicit value for a changed default, add an alias",{"type":39,"tag":75,"props":939,"children":940},{},[941,946,948,953],{"type":39,"tag":79,"props":942,"children":943},{},[944],{"type":45,"value":945},"A documented no-op",{"type":45,"value":947}," - the upgrade guide says it resolves on ",{"type":39,"tag":141,"props":949,"children":951},{"className":950},[],[952],{"type":45,"value":477},{"type":45,"value":954}," without\naffecting real infrastructure. This classification REQUIRES a citation from the upgrade\nguide or provider documentation. Your own judgment that \"this looks like a no-op\" is\nnot sufficient - the user is trusting you to distinguish real infrastructure changes\nfrom artifacts, and getting it wrong means unexpected changes to their cloud.",{"type":39,"tag":75,"props":956,"children":957},{},[958,963],{"type":39,"tag":79,"props":959,"children":960},{},[961],{"type":45,"value":962},"Requiring manual steps",{"type":45,"value":964}," - state removal + reimport, documented for the user",{"type":39,"tag":75,"props":966,"children":967},{},[968,973],{"type":39,"tag":79,"props":969,"children":970},{},[971],{"type":45,"value":972},"Unknown",{"type":45,"value":974}," - present what you've found to the user and ask for guidance",{"type":39,"tag":391,"props":976,"children":978},{"id":977},"category-c-provider-version-bump",[979],{"type":45,"value":980},"Category C: Provider version bump",{"type":39,"tag":55,"props":982,"children":983},{},[984,986,991,993,999],{"type":45,"value":985},"An ",{"type":39,"tag":141,"props":987,"children":989},{"className":988},[],[990],{"type":45,"value":422},{"type":45,"value":992}," on ",{"type":39,"tag":141,"props":994,"children":996},{"className":995},[],[997],{"type":45,"value":998},"pulumi:providers:{name}",{"type":45,"value":1000}," showing only a version change is the one\nexpected diff. Verify no other properties changed on the provider resource.",{"type":39,"tag":391,"props":1002,"children":1004},{"id":1003},"after-categorizing",[1005],{"type":45,"value":1006},"After categorizing",{"type":39,"tag":55,"props":1008,"children":1009},{},[1010,1015,1017,1022,1024,1030],{"type":39,"tag":79,"props":1011,"children":1012},{},[1013],{"type":45,"value":1014},"Completeness check:",{"type":45,"value":1016}," Every resource in the preview that shows any non-",{"type":39,"tag":141,"props":1018,"children":1020},{"className":1019},[],[1021],{"type":45,"value":300},{"type":45,"value":1023}," state\nmust appear in your checkpoint - including resources with ",{"type":39,"tag":141,"props":1025,"children":1027},{"className":1026},[],[1028],{"type":45,"value":1029},"[diff: ...]",{"type":45,"value":1031}," annotations,\neven if they don't have an explicit create\u002Fupdate\u002Fdelete marker. If you didn't list it,\nyour checkpoint is incomplete. Go back and categorize the missing resources.",{"type":39,"tag":55,"props":1033,"children":1034},{},[1035,1040],{"type":39,"tag":79,"props":1036,"children":1037},{},[1038],{"type":45,"value":1039},"Evidence requirement for accepted diffs:",{"type":45,"value":1041}," If you want to accept any diff as \"OK\"\n(not fix it), you need evidence - whether it's Category A or Category B. \"I believe the\nAPI treats these equivalently\" or \"this looks like state reconciliation\" is not evidence.\nAcceptable evidence: the upgrade guide documents it, a GitHub issue confirms it, or the\nprovider documentation explains the behavior. If you can't find evidence, either fix the\ndiff or flag it to the user.",{"type":39,"tag":55,"props":1043,"children":1044},{},[1045,1050],{"type":39,"tag":79,"props":1046,"children":1047},{},[1048],{"type":45,"value":1049},"Ordering:",{"type":45,"value":1051}," Fix all Category A issues before investigating Category B. Your code\ncorrections will change the preview output, so investigating Category B diffs first wastes\neffort. Fix your own mistakes first, re-preview, then look at what remains.",{"type":39,"tag":55,"props":1053,"children":1054},{},[1055,1075,1077,1082],{"type":39,"tag":79,"props":1056,"children":1057},{},[1058,1060,1065,1067,1073],{"type":45,"value":1059},"No ",{"type":39,"tag":141,"props":1061,"children":1063},{"className":1062},[],[1064],{"type":45,"value":807},{"type":45,"value":1066}," or ",{"type":39,"tag":141,"props":1068,"children":1070},{"className":1069},[],[1071],{"type":45,"value":1072},"replace",{"type":45,"value":1074}," in the final preview.",{"type":45,"value":1076}," If a delete or replace remains when\nyou're ready to create a PR, stop. A delete means ",{"type":39,"tag":141,"props":1078,"children":1080},{"className":1079},[],[1081],{"type":45,"value":477},{"type":45,"value":1083}," will destroy cloud\ninfrastructure. A replace means it will destroy and recreate. These are never acceptable\nas \"remaining diffs\" - they must be resolved (via code fix, alias, or documented manual\nsteps) before proceeding.",{"type":39,"tag":349,"props":1085,"children":1086},{},[],{"type":39,"tag":48,"props":1088,"children":1090},{"id":1089},"hard-rules",[1091],{"type":45,"value":1092},"Hard Rules",{"type":39,"tag":391,"props":1094,"children":1096},{"id":1095},"required-cli-flags",[1097],{"type":45,"value":1098},"Required CLI flags",{"type":39,"tag":55,"props":1100,"children":1101},{},[1102],{"type":45,"value":1103},"Use these flags when running preview. A preview without them can show false diffs\n(phantom tag removals, region additions) that aren't real. Don't interpret a preview\nthat was run without them.",{"type":39,"tag":133,"props":1105,"children":1109},{"className":1106,"code":1107,"language":1108,"meta":138,"style":138},"language-shell shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","pulumi preview --refresh --run-program\n","shell",[1110],{"type":39,"tag":141,"props":1111,"children":1112},{"__ignoreMap":138},[1113],{"type":39,"tag":145,"props":1114,"children":1115},{"class":147,"line":148},[1116,1121,1126,1131],{"type":39,"tag":145,"props":1117,"children":1119},{"style":1118},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[1120],{"type":45,"value":8},{"type":39,"tag":145,"props":1122,"children":1123},{"style":610},[1124],{"type":45,"value":1125}," preview",{"type":39,"tag":145,"props":1127,"children":1128},{"style":610},[1129],{"type":45,"value":1130}," --refresh",{"type":39,"tag":145,"props":1132,"children":1133},{"style":610},[1134],{"type":45,"value":1135}," --run-program\n",{"type":39,"tag":925,"props":1137,"children":1138},{},[1139,1150],{"type":39,"tag":75,"props":1140,"children":1141},{},[1142,1148],{"type":39,"tag":141,"props":1143,"children":1145},{"className":1144},[],[1146],{"type":45,"value":1147},"--refresh",{"type":45,"value":1149}," refreshes actual cloud state before diffing.",{"type":39,"tag":75,"props":1151,"children":1152},{},[1153,1159],{"type":39,"tag":141,"props":1154,"children":1156},{"className":1155},[],[1157],{"type":45,"value":1158},"--run-program",{"type":45,"value":1160}," runs the Pulumi program during refresh.",{"type":39,"tag":391,"props":1162,"children":1164},{"id":1163},"dont-chase-deprecations",[1165],{"type":45,"value":1166},"Don't chase deprecations",{"type":39,"tag":55,"props":1168,"children":1169},{},[1170],{"type":45,"value":1171},"If something is deprecated but still works, leave it alone. Migrating to the replacement\nintroduces risk for no benefit. A deprecation warning is acceptable - a diff is not.",{"type":39,"tag":133,"props":1173,"children":1175},{"className":531,"code":1174,"language":533,"meta":138,"style":138},"\u002F\u002F BAD: migrating deprecated-but-working properties introduces risk\nnew aws.s3.Bucket('bucket');\nnew aws.s3.BucketLogging('bucketLogging', {...});  \u002F\u002F unnecessary migration\n\n\u002F\u002F GOOD: fix only the actual error, leave working code alone\nnew aws.s3.Bucket('bucket', {\n  logging: {...},  \u002F\u002F \"loggings\" renamed to \"logging\" - real breaking change\n  website: {...},  \u002F\u002F deprecated but works - don't touch\n});\n",[1176],{"type":39,"tag":141,"props":1177,"children":1178},{"__ignoreMap":138},[1179,1187,1243,1311,1318,1326,1377,1399,1420],{"type":39,"tag":145,"props":1180,"children":1181},{"class":147,"line":148},[1182],{"type":39,"tag":145,"props":1183,"children":1184},{"style":543},[1185],{"type":45,"value":1186},"\u002F\u002F BAD: migrating deprecated-but-working properties introduces risk\n",{"type":39,"tag":145,"props":1188,"children":1189},{"class":147,"line":157},[1190,1195,1199,1203,1208,1212,1217,1221,1226,1231,1235,1239],{"type":39,"tag":145,"props":1191,"children":1192},{"style":564},[1193],{"type":45,"value":1194},"new",{"type":39,"tag":145,"props":1196,"children":1197},{"style":558},[1198],{"type":45,"value":577},{"type":39,"tag":145,"props":1200,"children":1201},{"style":564},[1202],{"type":45,"value":582},{"type":39,"tag":145,"props":1204,"children":1205},{"style":558},[1206],{"type":45,"value":1207},"s3",{"type":39,"tag":145,"props":1209,"children":1210},{"style":564},[1211],{"type":45,"value":582},{"type":39,"tag":145,"props":1213,"children":1214},{"style":594},[1215],{"type":45,"value":1216},"Bucket",{"type":39,"tag":145,"props":1218,"children":1219},{"style":558},[1220],{"type":45,"value":602},{"type":39,"tag":145,"props":1222,"children":1223},{"style":564},[1224],{"type":45,"value":1225},"'",{"type":39,"tag":145,"props":1227,"children":1228},{"style":610},[1229],{"type":45,"value":1230},"bucket",{"type":39,"tag":145,"props":1232,"children":1233},{"style":564},[1234],{"type":45,"value":1225},{"type":39,"tag":145,"props":1236,"children":1237},{"style":558},[1238],{"type":45,"value":642},{"type":39,"tag":145,"props":1240,"children":1241},{"style":564},[1242],{"type":45,"value":647},{"type":39,"tag":145,"props":1244,"children":1245},{"class":147,"line":166},[1246,1250,1254,1258,1262,1266,1271,1275,1279,1284,1288,1292,1297,1301,1306],{"type":39,"tag":145,"props":1247,"children":1248},{"style":564},[1249],{"type":45,"value":1194},{"type":39,"tag":145,"props":1251,"children":1252},{"style":558},[1253],{"type":45,"value":577},{"type":39,"tag":145,"props":1255,"children":1256},{"style":564},[1257],{"type":45,"value":582},{"type":39,"tag":145,"props":1259,"children":1260},{"style":558},[1261],{"type":45,"value":1207},{"type":39,"tag":145,"props":1263,"children":1264},{"style":564},[1265],{"type":45,"value":582},{"type":39,"tag":145,"props":1267,"children":1268},{"style":594},[1269],{"type":45,"value":1270},"BucketLogging",{"type":39,"tag":145,"props":1272,"children":1273},{"style":558},[1274],{"type":45,"value":602},{"type":39,"tag":145,"props":1276,"children":1277},{"style":564},[1278],{"type":45,"value":1225},{"type":39,"tag":145,"props":1280,"children":1281},{"style":610},[1282],{"type":45,"value":1283},"bucketLogging",{"type":39,"tag":145,"props":1285,"children":1286},{"style":564},[1287],{"type":45,"value":1225},{"type":39,"tag":145,"props":1289,"children":1290},{"style":564},[1291],{"type":45,"value":622},{"type":39,"tag":145,"props":1293,"children":1294},{"style":564},[1295],{"type":45,"value":1296}," {...}",{"type":39,"tag":145,"props":1298,"children":1299},{"style":558},[1300],{"type":45,"value":642},{"type":39,"tag":145,"props":1302,"children":1303},{"style":564},[1304],{"type":45,"value":1305},";",{"type":39,"tag":145,"props":1307,"children":1308},{"style":543},[1309],{"type":45,"value":1310},"  \u002F\u002F unnecessary migration\n",{"type":39,"tag":145,"props":1312,"children":1313},{"class":147,"line":27},[1314],{"type":39,"tag":145,"props":1315,"children":1316},{"emptyLinePlaceholder":653},[1317],{"type":45,"value":656},{"type":39,"tag":145,"props":1319,"children":1320},{"class":147,"line":183},[1321],{"type":39,"tag":145,"props":1322,"children":1323},{"style":543},[1324],{"type":45,"value":1325},"\u002F\u002F GOOD: fix only the actual error, leave working code alone\n",{"type":39,"tag":145,"props":1327,"children":1328},{"class":147,"line":192},[1329,1333,1337,1341,1345,1349,1353,1357,1361,1365,1369,1373],{"type":39,"tag":145,"props":1330,"children":1331},{"style":564},[1332],{"type":45,"value":1194},{"type":39,"tag":145,"props":1334,"children":1335},{"style":558},[1336],{"type":45,"value":577},{"type":39,"tag":145,"props":1338,"children":1339},{"style":564},[1340],{"type":45,"value":582},{"type":39,"tag":145,"props":1342,"children":1343},{"style":558},[1344],{"type":45,"value":1207},{"type":39,"tag":145,"props":1346,"children":1347},{"style":564},[1348],{"type":45,"value":582},{"type":39,"tag":145,"props":1350,"children":1351},{"style":594},[1352],{"type":45,"value":1216},{"type":39,"tag":145,"props":1354,"children":1355},{"style":558},[1356],{"type":45,"value":602},{"type":39,"tag":145,"props":1358,"children":1359},{"style":564},[1360],{"type":45,"value":1225},{"type":39,"tag":145,"props":1362,"children":1363},{"style":610},[1364],{"type":45,"value":1230},{"type":39,"tag":145,"props":1366,"children":1367},{"style":564},[1368],{"type":45,"value":1225},{"type":39,"tag":145,"props":1370,"children":1371},{"style":564},[1372],{"type":45,"value":622},{"type":39,"tag":145,"props":1374,"children":1375},{"style":564},[1376],{"type":45,"value":741},{"type":39,"tag":145,"props":1378,"children":1379},{"class":147,"line":201},[1380,1385,1389,1394],{"type":39,"tag":145,"props":1381,"children":1382},{"style":747},[1383],{"type":45,"value":1384},"  logging",{"type":39,"tag":145,"props":1386,"children":1387},{"style":564},[1388],{"type":45,"value":424},{"type":39,"tag":145,"props":1390,"children":1391},{"style":564},[1392],{"type":45,"value":1393}," {...},",{"type":39,"tag":145,"props":1395,"children":1396},{"style":543},[1397],{"type":45,"value":1398},"  \u002F\u002F \"loggings\" renamed to \"logging\" - real breaking change\n",{"type":39,"tag":145,"props":1400,"children":1401},{"class":147,"line":210},[1402,1407,1411,1415],{"type":39,"tag":145,"props":1403,"children":1404},{"style":747},[1405],{"type":45,"value":1406},"  website",{"type":39,"tag":145,"props":1408,"children":1409},{"style":564},[1410],{"type":45,"value":424},{"type":39,"tag":145,"props":1412,"children":1413},{"style":564},[1414],{"type":45,"value":1393},{"type":39,"tag":145,"props":1416,"children":1417},{"style":543},[1418],{"type":45,"value":1419},"  \u002F\u002F deprecated but works - don't touch\n",{"type":39,"tag":145,"props":1421,"children":1422},{"class":147,"line":219},[1423,1427,1431],{"type":39,"tag":145,"props":1424,"children":1425},{"style":564},[1426],{"type":45,"value":785},{"type":39,"tag":145,"props":1428,"children":1429},{"style":558},[1430],{"type":45,"value":642},{"type":39,"tag":145,"props":1432,"children":1433},{"style":564},[1434],{"type":45,"value":647},{"type":39,"tag":391,"props":1436,"children":1438},{"id":1437},"be-minimally-invasive",[1439],{"type":45,"value":1440},"Be minimally invasive",{"type":39,"tag":55,"props":1442,"children":1443},{},[1444],{"type":45,"value":1445},"Every line changed could introduce a regression. Prefer the smallest change that works.",{"type":39,"tag":391,"props":1447,"children":1449},{"id":1448},"do-not-run-pulumi-up",[1450],{"type":45,"value":1451},"Do not run pulumi up",{"type":39,"tag":55,"props":1453,"children":1454},{},[1455],{"type":45,"value":1456},"Provider upgrades modify source code and need code review before deployment.\nPR -> review -> merge -> deploy via CI\u002FCD.",{"type":39,"tag":349,"props":1458,"children":1459},{},[],{"type":39,"tag":48,"props":1461,"children":1463},{"id":1462},"getting-started",[1464],{"type":45,"value":1465},"Getting Started",{"type":39,"tag":391,"props":1467,"children":1469},{"id":1468},"_1-get-version-information",[1470],{"type":45,"value":1471},"1. Get version information",{"type":39,"tag":55,"props":1473,"children":1474},{},[1475],{"type":45,"value":1476},"Determine the target version from the user's request, the Pulumi Registry, package\nmanager metadata, or the repository's existing dependency constraints.",{"type":39,"tag":55,"props":1478,"children":1479},{},[1480,1482,1488],{"type":45,"value":1481},"Default to the latest stable version if the user hasn't specified a target version.\nIf the user asks which stacks or projects are affected, use skill ",{"type":39,"tag":141,"props":1483,"children":1485},{"className":1484},[],[1486],{"type":45,"value":1487},"package-usage",{"type":45,"value":1489}," or\nthe best available package inventory tooling before making changes.",{"type":39,"tag":391,"props":1491,"children":1493},{"id":1492},"_2-update-the-dependency",[1494],{"type":45,"value":1495},"2. Update the dependency",{"type":39,"tag":925,"props":1497,"children":1498},{},[1499,1522,1555,1594,1609,1633],{"type":39,"tag":75,"props":1500,"children":1501},{},[1502,1507,1509,1515,1516],{"type":39,"tag":79,"props":1503,"children":1504},{},[1505],{"type":45,"value":1506},"TypeScript\u002FJavaScript",{"type":45,"value":1508},": ",{"type":39,"tag":141,"props":1510,"children":1512},{"className":1511},[],[1513],{"type":45,"value":1514},"npm install @pulumi\u002F{provider}@^{version}",{"type":45,"value":1066},{"type":39,"tag":141,"props":1517,"children":1519},{"className":1518},[],[1520],{"type":45,"value":1521},"yarn add @pulumi\u002F{provider}@^{version}",{"type":39,"tag":75,"props":1523,"children":1524},{},[1525,1530,1532,1538,1539,1545,1547,1553],{"type":39,"tag":79,"props":1526,"children":1527},{},[1528],{"type":45,"value":1529},"Python",{"type":45,"value":1531},": Update ",{"type":39,"tag":141,"props":1533,"children":1535},{"className":1534},[],[1536],{"type":45,"value":1537},"pyproject.toml",{"type":45,"value":1066},{"type":39,"tag":141,"props":1540,"children":1542},{"className":1541},[],[1543],{"type":45,"value":1544},"requirements.txt",{"type":45,"value":1546}," with ",{"type":39,"tag":141,"props":1548,"children":1550},{"className":1549},[],[1551],{"type":45,"value":1552},"pulumi_{provider}>={version}",{"type":45,"value":1554}," (underscore, not hyphen), then install",{"type":39,"tag":75,"props":1556,"children":1557},{},[1558,1563,1564,1570,1572,1578,1580,1586,1588],{"type":39,"tag":79,"props":1559,"children":1560},{},[1561],{"type":45,"value":1562},"Go",{"type":45,"value":1508},{"type":39,"tag":141,"props":1565,"children":1567},{"className":1566},[],[1568],{"type":45,"value":1569},"go get github.com\u002Fpulumi\u002Fpulumi-{provider}\u002Fsdk\u002Fv{major}@latest",{"type":45,"value":1571},", update all import paths (e.g., ",{"type":39,"tag":141,"props":1573,"children":1575},{"className":1574},[],[1576],{"type":45,"value":1577},"v6",{"type":45,"value":1579}," -> ",{"type":39,"tag":141,"props":1581,"children":1583},{"className":1582},[],[1584],{"type":45,"value":1585},"v7",{"type":45,"value":1587},"), run ",{"type":39,"tag":141,"props":1589,"children":1591},{"className":1590},[],[1592],{"type":45,"value":1593},"go mod tidy",{"type":39,"tag":75,"props":1595,"children":1596},{},[1597,1602,1603],{"type":39,"tag":79,"props":1598,"children":1599},{},[1600],{"type":45,"value":1601},".NET",{"type":45,"value":1508},{"type":39,"tag":141,"props":1604,"children":1606},{"className":1605},[],[1607],{"type":45,"value":1608},"dotnet add package Pulumi.{Provider} --version {version}",{"type":39,"tag":75,"props":1610,"children":1611},{},[1612,1617,1618,1624,1625,1631],{"type":39,"tag":79,"props":1613,"children":1614},{},[1615],{"type":45,"value":1616},"Java",{"type":45,"value":1531},{"type":39,"tag":141,"props":1619,"children":1621},{"className":1620},[],[1622],{"type":45,"value":1623},"pom.xml",{"type":45,"value":1066},{"type":39,"tag":141,"props":1626,"children":1628},{"className":1627},[],[1629],{"type":45,"value":1630},"build.gradle",{"type":45,"value":1632}," dependency version",{"type":39,"tag":75,"props":1634,"children":1635},{},[1636,1641,1643,1651],{"type":39,"tag":79,"props":1637,"children":1638},{},[1639],{"type":45,"value":1640},"YAML",{"type":45,"value":1642},": Update provider version in resource options or provider configuration. See ",{"type":39,"tag":1644,"props":1645,"children":1649},"a",{"href":1646,"rel":1647},"https:\u002F\u002Fwww.pulumi.com\u002Fdocs\u002Fiac\u002Flanguages-sdks\u002Fyaml\u002Fyaml-language-reference\u002F#providers-and-provider-versions",[1648],"nofollow",[1650],{"type":45,"value":1646},{"type":45,"value":1652}," for examples.",{"type":39,"tag":55,"props":1654,"children":1655},{},[1656],{"type":45,"value":1657},"After installing, check the actual installed version from the lockfile (package-lock.json,\ngo.sum, etc.) - use these exact versions for schema-tools comparisons.",{"type":39,"tag":391,"props":1659,"children":1661},{"id":1660},"_3-run-preview",[1662],{"type":45,"value":1663},"3. Run preview",{"type":39,"tag":55,"props":1665,"children":1666},{},[1667,1669,1675],{"type":45,"value":1668},"Run ",{"type":39,"tag":141,"props":1670,"children":1672},{"className":1671},[],[1673],{"type":45,"value":1674},"pulumi preview --refresh --run-program",{"type":45,"value":1676}," immediately after updating the dependency.\nDo not research breaking changes first - many upgrades just work, especially minor\nversions.",{"type":39,"tag":55,"props":1678,"children":1679},{},[1680],{"type":45,"value":1681},"If the preview is clean (only the provider version bump), create a PR.",{"type":39,"tag":349,"props":1683,"children":1684},{},[],{"type":39,"tag":48,"props":1686,"children":1688},{"id":1687},"preview-progress",[1689],{"type":45,"value":1690},"Preview Progress",{"type":39,"tag":55,"props":1692,"children":1693},{},[1694],{"type":45,"value":1695},"Preview can fail on the first error and hide others. Fixing one error often reveals new\nerrors. This is normal progress, not a sign that fixes are making things worse.",{"type":39,"tag":925,"props":1697,"children":1698},{},[1699,1709,1718,1728],{"type":39,"tag":75,"props":1700,"children":1701},{},[1702,1707],{"type":39,"tag":79,"props":1703,"children":1704},{},[1705],{"type":45,"value":1706},"New or different errors",{"type":45,"value":1708}," -> progress, continue",{"type":39,"tag":75,"props":1710,"children":1711},{},[1712,1717],{"type":39,"tag":79,"props":1713,"children":1714},{},[1715],{"type":45,"value":1716},"Error set shrank",{"type":45,"value":1708},{"type":39,"tag":75,"props":1719,"children":1720},{},[1721,1726],{"type":39,"tag":79,"props":1722,"children":1723},{},[1724],{"type":45,"value":1725},"Same error persists",{"type":45,"value":1727}," -> your fix didn't work, try a different approach",{"type":39,"tag":75,"props":1729,"children":1730},{},[1731,1736],{"type":39,"tag":79,"props":1732,"children":1733},{},[1734],{"type":45,"value":1735},"No errors but diffs",{"type":45,"value":1737}," -> run the diff checkpoint",{"type":39,"tag":349,"props":1739,"children":1740},{},[],{"type":39,"tag":48,"props":1742,"children":1744},{"id":1743},"upgrade-summary",[1745],{"type":45,"value":1746},"Upgrade Summary",{"type":39,"tag":55,"props":1748,"children":1749},{},[1750],{"type":45,"value":1751},"Once the preview is clean (or as clean as possible), present the summary:",{"type":39,"tag":133,"props":1753,"children":1757},{"className":1754,"code":1756,"language":45},[1755],"language-text","## Upgrade Summary: {provider} v{current} -> v{target}\n\n### Code Changes\n| File | Change | Why it preserves intent |\n|------|--------|------------------------|\n| package.json | Version bump | - |\n| index.ts:15 | loggings -> logging | Property renamed, same underlying field |\n\n### Preview Result\nAll resources show `same` except provider version bump.\n{Or: N resources show diffs - see below}\n\n### Remaining Diffs (if any)\n| Resource | Operation | What happens on `pulumi up` | Risk | Source |\n|----------|-----------|---------------------------|------|--------|\n| aws:s3:Bucket (myBucket) | update (-tags) | No-op, state reconciles | None | AWS v7 guide section 3.2 |\n\nEvery remaining diff MUST cite an authoritative source (upgrade guide, provider docs,\nupstream GitHub issue). \"I believe this is expected\" is not a source.\n\n### Manual Steps Required (if any)\n1. `pulumi state delete '\u003Curn>'` - remove old type binding\n2. `pulumi import \u003Ctype> \u003Cname> \u003Cid>` - adopt under new type\n3. `pulumi preview --refresh --run-program` - verify clean\n\n### Deprecation Warnings (no action taken)\n- List deprecated-but-working code left intentionally\n",[1758],{"type":39,"tag":141,"props":1759,"children":1760},{"__ignoreMap":138},[1761],{"type":45,"value":1756},{"type":39,"tag":55,"props":1763,"children":1764},{},[1765],{"type":45,"value":1766},"If the preview is clean (or all remaining diffs are documented no-ops with cited sources),\ncreate a pull request. If unresolved diffs remain, present the summary as an exception\nreport and ask the user how they'd like to proceed before creating a PR.",{"type":39,"tag":349,"props":1768,"children":1769},{},[],{"type":39,"tag":48,"props":1771,"children":1773},{"id":1772},"references",[1774],{"type":45,"value":1775},"References",{"type":39,"tag":925,"props":1777,"children":1778},{},[1779],{"type":39,"tag":75,"props":1780,"children":1781},{},[1782,1787],{"type":39,"tag":141,"props":1783,"children":1785},{"className":1784},[],[1786],{"type":45,"value":916},{"type":45,"value":1788}," - upgrade guides, schema-tools (install, run,\ninterpret output), stack state inspection, SDK types, GitHub issues. Read when\ninvestigating Category B diffs.",{"type":39,"tag":1790,"props":1791,"children":1792},"style",{},[1793],{"type":45,"value":1794},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":1796,"total":246},[1797,1813,1827,1834,1848,1863,1876],{"slug":1798,"name":1798,"fn":1799,"description":1800,"org":1801,"tags":1802,"stars":23,"repoUrl":24,"updatedAt":1812},"cloudformation-to-pulumi","migrate CloudFormation to Pulumi","Convert, migrate, or import AWS CloudFormation stacks or templates into Pulumi programs. Load this skill whenever a user wants to move from CloudFormation to Pulumi, convert a CFN template, import existing CloudFormation-managed resources into Pulumi, or asks about CloudFormation-to-Pulumi migration in any form. Also load when the user mentions cdk-importer in a migration context.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1803,1806,1809,1810,1811],{"name":1804,"slug":1805,"type":15},"AWS","aws",{"name":1807,"slug":1808,"type":15},"Deployment","deployment",{"name":21,"slug":22,"type":15},{"name":18,"slug":19,"type":15},{"name":9,"slug":8,"type":15},"2026-04-06T18:50:36.677615",{"slug":1487,"name":1487,"fn":1814,"description":1815,"org":1816,"tags":1817,"stars":23,"repoUrl":24,"updatedAt":1826},"audit Pulumi package usage across stacks","Track which stacks across a Pulumi organization use a specific package and at what versions. Use for cross-stack audits, identifying outdated or unmaintained package versions across many stacks, finding affected stacks before publishing breaking changes to a component package, or planning coordinated upgrade rollouts. Do NOT use for upgrading a cloud provider package (pulumi-aws, pulumi-azure-native, pulumi-gcp, pulumi-kubernetes, etc.) in a single project — use skill `provider-upgrade` instead. Do NOT use for general infrastructure creation, resource provisioning, or how-to questions about a package.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1818,1821,1822,1825],{"name":1819,"slug":1820,"type":15},"Audit","audit",{"name":21,"slug":22,"type":15},{"name":1823,"slug":1824,"type":15},"Operations","operations",{"name":9,"slug":8,"type":15},"2026-07-24T05:37:48.019964",{"slug":4,"name":4,"fn":5,"description":6,"org":1828,"tags":1829,"stars":23,"repoUrl":24,"updatedAt":25},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1830,1831,1832,1833],{"name":13,"slug":14,"type":15},{"name":21,"slug":22,"type":15},{"name":18,"slug":19,"type":15},{"name":9,"slug":8,"type":15},{"slug":1835,"name":1835,"fn":1836,"description":1837,"org":1838,"tags":1839,"stars":23,"repoUrl":24,"updatedAt":1847},"pulumi-arm-to-pulumi","migrate Azure ARM to Pulumi","Convert or migrate Azure ARM (Azure Resource Manager) templates, Bicep templates, or code to Pulumi, including importing existing Azure resources. This skill MUST be loaded whenever a user requests migration, conversion, or import of ARM templates, Bicep templates, ARM code, Bicep code, or Azure resources to Pulumi.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1840,1843,1844,1845,1846],{"name":1841,"slug":1842,"type":15},"Azure","azure",{"name":1807,"slug":1808,"type":15},{"name":21,"slug":22,"type":15},{"name":18,"slug":19,"type":15},{"name":9,"slug":8,"type":15},"2026-04-06T18:50:35.384851",{"slug":1849,"name":1849,"fn":1850,"description":1851,"org":1852,"tags":1853,"stars":23,"repoUrl":24,"updatedAt":1862},"pulumi-automation-api","run Pulumi programs via Automation API","Load this skill when a user asks how to run Pulumi programmatically, embed Pulumi in an application, orchestrate multiple stacks in code, build a self-service infrastructure portal, replace pulumi CLI shell scripts with code, or use the Pulumi Automation API (LocalWorkspace, createOrSelectStack, inline programs). Also load for questions about multi-stack sequencing, parallel deployments, or passing outputs between stacks via code.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1854,1857,1860,1861],{"name":1855,"slug":1856,"type":15},"API Development","api-development",{"name":1858,"slug":1859,"type":15},"Automation","automation",{"name":21,"slug":22,"type":15},{"name":9,"slug":8,"type":15},"2026-06-04T07:59:00.113998",{"slug":1864,"name":1864,"fn":1865,"description":1866,"org":1867,"tags":1868,"stars":23,"repoUrl":24,"updatedAt":1875},"pulumi-best-practices","apply Pulumi best practices for infrastructure","Load when the user is writing, reviewing, or debugging Pulumi TypeScript\u002FPython programs; asks about Output\u003CT> or apply() usage; wants to create ComponentResource classes; needs to refactor resources without destroying them (aliases); is setting up secrets or config; or is configuring a pulumi preview\u002Fup CI workflow. Also load for questions about resource dependency order, parent\u002Fchild resource relationships, or pulumi.interpolate.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1869,1870,1871,1873],{"name":21,"slug":22,"type":15},{"name":9,"slug":8,"type":15},{"name":1529,"slug":1872,"type":15},"python",{"name":1874,"slug":533,"type":15},"TypeScript","2026-06-03T07:52:43.916562",{"slug":1877,"name":1877,"fn":1878,"description":1879,"org":1880,"tags":1881,"stars":23,"repoUrl":24,"updatedAt":1887},"pulumi-cdk-to-pulumi","migrate AWS CDK to Pulumi","Load this skill when a user wants to migrate, convert, port, translate, or move an AWS CDK application (including CDK stacks, constructs, or CloudFormation-synthesized templates) to Pulumi. Phrases such as \"convert CDK to Pulumi\", \"migrate CDK app\", \"port CDK stacks\", \"replace CDK with Pulumi\", \"stop using CDK\". Do NOT load for general CDK questions, CDK-only help, or CDK vs Pulumi comparisons where no migration is requested.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1882,1883,1884,1885,1886],{"name":1804,"slug":1805,"type":15},{"name":1807,"slug":1808,"type":15},{"name":21,"slug":22,"type":15},{"name":18,"slug":19,"type":15},{"name":9,"slug":8,"type":15},"2026-04-06T18:50:39.23999",{"items":1889,"total":246},[1890,1898,1905,1912,1920,1927,1934,1942,1957,1970,1985,1995],{"slug":1798,"name":1798,"fn":1799,"description":1800,"org":1891,"tags":1892,"stars":23,"repoUrl":24,"updatedAt":1812},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1893,1894,1895,1896,1897],{"name":1804,"slug":1805,"type":15},{"name":1807,"slug":1808,"type":15},{"name":21,"slug":22,"type":15},{"name":18,"slug":19,"type":15},{"name":9,"slug":8,"type":15},{"slug":1487,"name":1487,"fn":1814,"description":1815,"org":1899,"tags":1900,"stars":23,"repoUrl":24,"updatedAt":1826},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1901,1902,1903,1904],{"name":1819,"slug":1820,"type":15},{"name":21,"slug":22,"type":15},{"name":1823,"slug":1824,"type":15},{"name":9,"slug":8,"type":15},{"slug":4,"name":4,"fn":5,"description":6,"org":1906,"tags":1907,"stars":23,"repoUrl":24,"updatedAt":25},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1908,1909,1910,1911],{"name":13,"slug":14,"type":15},{"name":21,"slug":22,"type":15},{"name":18,"slug":19,"type":15},{"name":9,"slug":8,"type":15},{"slug":1835,"name":1835,"fn":1836,"description":1837,"org":1913,"tags":1914,"stars":23,"repoUrl":24,"updatedAt":1847},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1915,1916,1917,1918,1919],{"name":1841,"slug":1842,"type":15},{"name":1807,"slug":1808,"type":15},{"name":21,"slug":22,"type":15},{"name":18,"slug":19,"type":15},{"name":9,"slug":8,"type":15},{"slug":1849,"name":1849,"fn":1850,"description":1851,"org":1921,"tags":1922,"stars":23,"repoUrl":24,"updatedAt":1862},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1923,1924,1925,1926],{"name":1855,"slug":1856,"type":15},{"name":1858,"slug":1859,"type":15},{"name":21,"slug":22,"type":15},{"name":9,"slug":8,"type":15},{"slug":1864,"name":1864,"fn":1865,"description":1866,"org":1928,"tags":1929,"stars":23,"repoUrl":24,"updatedAt":1875},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1930,1931,1932,1933],{"name":21,"slug":22,"type":15},{"name":9,"slug":8,"type":15},{"name":1529,"slug":1872,"type":15},{"name":1874,"slug":533,"type":15},{"slug":1877,"name":1877,"fn":1878,"description":1879,"org":1935,"tags":1936,"stars":23,"repoUrl":24,"updatedAt":1887},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1937,1938,1939,1940,1941],{"name":1804,"slug":1805,"type":15},{"name":1807,"slug":1808,"type":15},{"name":21,"slug":22,"type":15},{"name":18,"slug":19,"type":15},{"name":9,"slug":8,"type":15},{"slug":1943,"name":1943,"fn":1944,"description":1945,"org":1946,"tags":1947,"stars":23,"repoUrl":24,"updatedAt":1956},"pulumi-component","author reusable Pulumi component resources","Guide for authoring Pulumi ComponentResource classes. Use when creating reusable infrastructure components, designing component interfaces, setting up multi-language support, or distributing component packages.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1948,1951,1954,1955],{"name":1949,"slug":1950,"type":15},"Architecture","architecture",{"name":1952,"slug":1953,"type":15},"Engineering","engineering",{"name":21,"slug":22,"type":15},{"name":9,"slug":8,"type":15},"2026-06-04T07:58:57.625622",{"slug":1958,"name":1958,"fn":1959,"description":1960,"org":1961,"tags":1962,"stars":23,"repoUrl":24,"updatedAt":1969},"pulumi-debug-failed-operation","debug failed Pulumi operations","Debug a Pulumi update or preview that failed: read the failure Pulumi already\nrecorded, find what caused it, and fix it. Load this skill when the user asks\nto debug, diagnose, or fix a failed update or preview, or points at a failing\n`pulumi up` or `pulumi preview`. Don't load it for authoring new\ninfrastructure, migrations, or provider upgrades; those have their own skills.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1963,1966,1967,1968],{"name":1964,"slug":1965,"type":15},"Debugging","debugging",{"name":1807,"slug":1808,"type":15},{"name":21,"slug":22,"type":15},{"name":9,"slug":8,"type":15},"2026-07-08T05:47:02.688144",{"slug":1971,"name":1971,"fn":1972,"description":1973,"org":1974,"tags":1975,"stars":23,"repoUrl":24,"updatedAt":1984},"pulumi-esc","manage secrets and configuration with Pulumi ESC","Guidance for working with Pulumi ESC (Environments, Secrets, and Configuration). Use when users ask about managing secrets, configuration, environments, short-term credentials, configuring OIDC for AWS, Azure, GCP, integrating with secret stores (AWS Secrets Manager, Azure Key Vault, HashiCorp Vault, 1Password), or using ESC with Pulumi stacks.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1976,1979,1980,1981],{"name":1977,"slug":1978,"type":15},"Configuration","configuration",{"name":21,"slug":22,"type":15},{"name":9,"slug":8,"type":15},{"name":1982,"slug":1983,"type":15},"Security","security","2026-07-24T05:37:47.044405",{"slug":1986,"name":1986,"fn":1987,"description":1988,"org":1989,"tags":1990,"stars":23,"repoUrl":24,"updatedAt":1994},"pulumi-overview","manage cloud infrastructure with Pulumi","Use this skill for any task that creates, modifies, inspects, or destroys cloud infrastructure or SaaS configuration, from one-off CLI operations to full multi-resource projects, across providers in the Pulumi ecosystem. A typical project spans many providers (AWS or Azure or GCP, Kubernetes, Cloudflare, Auth0, Datadog, Vercel, and others), and Pulumi drives them through one CLI, one state model, and one credential layer. Trigger even when the user does not name Pulumi; phrasings like \"deploy this app,\" \"provision a database,\" \"stand up a VPC,\" \"configure Auth0,\" \"set up Datadog monitoring,\" or \"tear down staging\" qualify. Also trigger for tasks that migrate, port, or convert existing infrastructure code (Terraform, CloudFormation, CDK, Bicep, ARM) to Pulumi. Do not trigger for application runtime code that reads or writes data via cloud SDKs; that is application code, not infrastructure.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1991,1992,1993],{"name":1807,"slug":1808,"type":15},{"name":21,"slug":22,"type":15},{"name":9,"slug":8,"type":15},"2026-06-03T07:52:39.333565",{"slug":1996,"name":1996,"fn":1997,"description":1998,"org":1999,"tags":2000,"stars":23,"repoUrl":24,"updatedAt":2008},"pulumi-terraform-to-pulumi","migrate Terraform to Pulumi","Migrate Terraform\u002FOpenTofu projects to Pulumi, including translating HCL source code and\u002For importing Terraform state into a Pulumi stack. Use when a user wants to convert Terraform to Pulumi, migrate from HCL, or import tfstate into Pulumi. Do NOT trigger for general Terraform-vs-Pulumi comparisons or questions about using both tools side-by-side.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2001,2002,2003,2004,2005],{"name":1807,"slug":1808,"type":15},{"name":21,"slug":22,"type":15},{"name":18,"slug":19,"type":15},{"name":9,"slug":8,"type":15},{"name":2006,"slug":2007,"type":15},"Terraform","terraform","2026-04-06T18:50:37.954346"]