[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-azure-sdaf-safe-removal":3,"mdc-g0fqx0-key":35,"related-repo-azure-sdaf-safe-removal":1290,"related-org-azure-sdaf-safe-removal":1379},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":24,"repoUrl":25,"updatedAt":26,"license":27,"forks":28,"topics":29,"repo":30,"sourceUrl":33,"mdContent":34},"sdaf-safe-removal","remove SAP resources safely","Remove SDAF resources safely in reverse dependency order: stop SAP\u002Fdatabase services, back up data and state evidence, remove SAP systems before the workload zone, remove workload zones before the control plane, and validate incomplete teardown before any retry or ARM fallback. Grounded in `docs\u002Flocal\u002F07-00-operations.md`, `docs\u002Flocal\u002Ftroubleshooting.md`, `deploy\u002Fscripts\u002Fremover.sh`, `deploy\u002Fscripts\u002Fremove_controlplane.sh`, and the Azure DevOps ARM-fallback pipeline. Use when a user asks to remove an SAP system, workload zone, or control plane, to run `remover.sh` or `remove_controlplane.sh`, or to explain why a control-plane removal exited 0 while the deployer still exists. Do NOT use for explicit state `list` \u002F `import` \u002F `remove` operations (see `sdaf-state-management`) or generic failed-run triage (see `sdaf-failure-triage`).\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},"azure","Azure (Microsoft)","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fazure.png","Azure",[13,17,18,21],{"name":14,"slug":15,"type":16},"Operations","operations","tag",{"name":11,"slug":8,"type":16},{"name":19,"slug":20,"type":16},"SAP","sap",{"name":22,"slug":23,"type":16},"Infrastructure","infrastructure",143,"https:\u002F\u002Fgithub.com\u002FAzure\u002Fsap-automation","2026-09-02T07:47:43.953133","MIT",173,[],{"repoUrl":25,"stars":24,"forks":28,"topics":31,"description":32},[],"This is the repository supporting the SAP deployment automation framework on Azure","https:\u002F\u002Fgithub.com\u002FAzure\u002Fsap-automation\u002Ftree\u002FHEAD\u002Fskills\u002Fsdaf-safe-removal","---\nname: sdaf-safe-removal\ndescription: >\n  Remove SDAF resources safely in reverse dependency order: stop SAP\u002Fdatabase\n  services, back up data and state evidence, remove SAP systems before the\n  workload zone, remove workload zones before the control plane, and validate\n  incomplete teardown before any retry or ARM fallback. Grounded in\n  `docs\u002Flocal\u002F07-00-operations.md`, `docs\u002Flocal\u002Ftroubleshooting.md`,\n  `deploy\u002Fscripts\u002Fremover.sh`, `deploy\u002Fscripts\u002Fremove_controlplane.sh`, and the\n  Azure DevOps ARM-fallback pipeline. Use when a user asks to remove an SAP\n  system, workload zone, or control plane, to run `remover.sh` or\n  `remove_controlplane.sh`, or to explain why a control-plane removal exited 0\n  while the deployer still exists. Do NOT use for explicit state `list` \u002F\n  `import` \u002F `remove` operations (see `sdaf-state-management`) or generic\n  failed-run triage (see `sdaf-failure-triage`).\nallowed-tools: shell\nlicense: MIT\n---\n\n# SDAF Safe Removal\n\nAction-loop skill. Remove SDAF-managed resources only in the documented reverse dependency order and only after a reviewed destroy plan.\n\n## When to invoke\n\nTrigger on: \"remove an SAP system\", \"remove the workload zone\", \"remove the control plane\", \"safe teardown\", \"run remover.sh\", \"run remove_controlplane.sh\", \"destroy left resources behind\", \"the control-plane removal said success but the deployer is still there\".\n\nDo NOT trigger on: explicit Terraform state surgery, generic failed-run triage, or greenfield deployment.\n\n## Preconditions\n\n- Approved removal scope, maintenance window, identity, and retention plan (`docs\u002Flocal\u002F07-00-operations.md § Inputs`, `§ Prepare an operational change`).\n- SAP and database services stopped per product procedures, and business data, configuration, keys, logs, and state evidence backed up (`§ Remove resources`).\n- Keep the approved SDAF commit, configuration revision, remote-state account, state keys, `.sap_deployment_automation` metadata, and destroy output (`§ Before you begin`, `§ Retain logs and evidence`).\n- Run the stage script from the directory that contains the parameter file and pass the basename only (`docs\u002Flocal\u002Ftroubleshooting.md § A parameter file is not found`).\n\n## Reverse-order guard\n\nApply this order on every teardown (`docs\u002Flocal\u002F07-00-operations.md § Remove resources`):\n\n1. Remove each SAP system.\n2. Remove workload-zone resources only after every dependent SAP system is removed.\n3. Remove the control plane only after every dependent workload zone is removed.\n4. Remove retained shared or external resources separately according to their ownership.\n\nDo not continue to a broader scope until the narrower dependency is gone and the destroy output has been reviewed.\n\n## Run one approved removal stage at a time\n\n### Remove an SAP system\n\nFrom `WORKSPACES\u002FSYSTEM\u002F\u003CSAP_SYSTEM>`, exactly per `docs\u002Flocal\u002F07-00-operations.md § Remove an SAP system`:\n\n```bash\ncd \"$CONFIG_REPO_PATH\u002FWORKSPACES\u002FSYSTEM\u002F\u003CSAP_SYSTEM>\"\nARM_SUBSCRIPTION_ID=\"\u003CWORKLOAD_SUBSCRIPTION_ID>\" \\\n\"$SAP_AUTOMATION_REPO_PATH\u002Fdeploy\u002Fscripts\u002Fremover.sh\" \\\n  --type sap_system \\\n  --parameterfile \"\u003CSAP_SYSTEM>.tfvars\" \\\n  --control_plane_name \"\u003CCONTROL_PLANE>\" \\\n  --deployer_tfstate_key \"\u003CDEPLOYER_STATE_KEY>\" \\\n  --landscape_tfstate_key \"\u003CLANDSCAPE_STATE_KEY>\" \\\n  --storageaccountname \"\u003CSTATE_STORAGE_ACCOUNT>\" \\\n  --state_subscription \"\u003CSTATE_SUBSCRIPTION_ID>\"\n```\n\nReview the destroy plan and confirm only after backups and approvals are complete.\n\n### Remove a workload zone\n\nOnly after every dependent SAP system is removed. From `WORKSPACES\u002FLANDSCAPE\u002F\u003CWORKLOAD_ZONE>-INFRASTRUCTURE`, exactly per `docs\u002Flocal\u002F07-00-operations.md § Remove a workload zone`:\n\n```bash\ncd \"$CONFIG_REPO_PATH\u002FWORKSPACES\u002FLANDSCAPE\u002F\u003CWORKLOAD_ZONE>-INFRASTRUCTURE\"\nARM_SUBSCRIPTION_ID=\"\u003CWORKLOAD_SUBSCRIPTION_ID>\" \\\n\"$SAP_AUTOMATION_REPO_PATH\u002Fdeploy\u002Fscripts\u002Fremover.sh\" \\\n  --type sap_landscape \\\n  --parameterfile \"\u003CWORKLOAD_ZONE>-INFRASTRUCTURE.tfvars\" \\\n  --control_plane_name \"\u003CCONTROL_PLANE>\" \\\n  --deployer_tfstate_key \"\u003CDEPLOYER_STATE_KEY>\" \\\n  --storageaccountname \"\u003CSTATE_STORAGE_ACCOUNT>\" \\\n  --state_subscription \"\u003CSTATE_SUBSCRIPTION_ID>\"\n```\n\nConfirm the workload-zone state and any retained shared resources match the approved removal scope before approval.\n\n### Remove the control plane\n\nOnly after every dependent workload zone is removed. From `WORKSPACES`, exactly per `docs\u002Flocal\u002F07-00-operations.md § Remove the control plane`:\n\n```bash\ncd \"$CONFIG_REPO_PATH\u002FWORKSPACES\"\n\"$SAP_AUTOMATION_REPO_PATH\u002Fdeploy\u002Fscripts\u002Fremove_controlplane.sh\" \\\n  --deployer_parameter_file \\\n  \"$CONFIG_REPO_PATH\u002FWORKSPACES\u002FDEPLOYER\u002F\u003CCONTROL_PLANE>-INFRASTRUCTURE\u002F\u003CCONTROL_PLANE>-INFRASTRUCTURE.tfvars\" \\\n  --library_parameter_file \\\n  \"$CONFIG_REPO_PATH\u002FWORKSPACES\u002FLIBRARY\u002F\u003CENVIRONMENT>-\u003CLOCATION>-SAP_LIBRARY\u002F\u003CENVIRONMENT>-\u003CLOCATION>-SAP_LIBRARY.tfvars\"\n```\n\nReview each destroy operation. Use `--keep_agent` only when the deployment agent retention was explicitly approved and you understand the resulting partial removal (`docs\u002Flocal\u002F07-00-operations.md § Remove the control plane`).\n\n## If removal is incomplete\n\n`docs\u002Flocal\u002Ftroubleshooting.md § Removal is incomplete` is canonical:\n\n1. Preserve the destroy output.\n2. Confirm the dependency order was respected.\n3. Compare remaining Azure resources with the Terraform state list.\n4. Resolve locks, permissions, policies, and delete protections.\n5. For an SAP-system or workload-zone removal, rerun the same command and re-review the destroy plan.\n\n### Control-plane partial-removal trap\n\nDo **not** use the generic rerun rule for an interrupted control-plane removal. Inspect `$CONFIG_REPO_PATH\u002F.sap_deployment_automation`, its persisted `step`, the library destroy result, and the remaining deployer state and resources (`docs\u002Flocal\u002F07-00-operations.md § Retry deterministically`, `docs\u002Flocal\u002Ftroubleshooting.md § Removal is incomplete`).\n\nAfter the library destroy, `remove_controlplane.sh` persists `step=1`; a later invocation can exit successfully without destroying the deployer. Do not treat that exit as completion, do not edit the step to bypass the guard, and do not switch to ad-hoc resource-group deletion. Obtain expert review for a component-specific recovery path.\n\n## ARM fallback — last resort, Azure DevOps only\n\nThe only documented ARM fallback here is the Azure DevOps removal fallback.\nIt removes SAP systems, the workload zone, and the region through ARM\nresource-group deletion and is a fallback **only** when Terraform destroy does\nnot remove everything.\n\nUse that pipeline only after:\n\n- the normal reverse-order Terraform removal path was attempted,\n- the destroy output was captured and reviewed,\n- the approved scope still matches the remaining resource groups, and\n- the operator explicitly approves a resource-group deletion fallback.\n\nThis repo does not document a local-script or GitHub Actions ARM-fallback procedure. Do not invent one.\n\n## Hard rules\n\n- Do not pass `--auto-approve` (`docs\u002Flocal\u002F07-00-operations.md § Review before execution`).\n- Do not remove the remote-state account or edit state to hide a failure (`docs\u002Flocal\u002Ftroubleshooting.md § Removal is incomplete`).\n- Do not run ad-hoc `az group delete`, direct ARM deletion, or explicit Terraform state `list` \u002F `import` \u002F `remove` commands in place of the documented sequence; the state-operation boundary belongs to `sdaf-state-management`.\n- Do not treat a control-plane rerun that exits `0` after `step=1` as completed removal.\n- Documented behaviour only; if the docs or shipped scripts are silent, stop.\n- Repo-wide rules apply: follow [`.github\u002Fcopilot-instructions.md`](..\u002F..\u002F.github\u002Fcopilot-instructions.md).\n\n## See also\n\n- `sdaf-state-management`, `sdaf-failure-triage`, `sdaf-control-plane-bootstrap`, `sdaf-workload-zone`, `sdaf-sap-system`.\n- `docs\u002Flocal\u002F07-00-operations.md`, `docs\u002Flocal\u002Ftroubleshooting.md`, and\n  `docs\u002Flocal\u002FREADME.md`.\n",{"data":36,"body":38},{"name":4,"description":6,"allowed-tools":37,"license":27},"shell",{"type":39,"children":40},"root",[41,49,55,62,67,72,78,156,162,175,199,204,210,217,238,514,519,525,544,753,758,764,783,903,922,928,939,967,973,1015,1036,1042,1054,1059,1082,1087,1093,1213,1219,1284],{"type":42,"tag":43,"props":44,"children":45},"element","h1",{"id":4},[46],{"type":47,"value":48},"text","SDAF Safe Removal",{"type":42,"tag":50,"props":51,"children":52},"p",{},[53],{"type":47,"value":54},"Action-loop skill. Remove SDAF-managed resources only in the documented reverse dependency order and only after a reviewed destroy plan.",{"type":42,"tag":56,"props":57,"children":59},"h2",{"id":58},"when-to-invoke",[60],{"type":47,"value":61},"When to invoke",{"type":42,"tag":50,"props":63,"children":64},{},[65],{"type":47,"value":66},"Trigger on: \"remove an SAP system\", \"remove the workload zone\", \"remove the control plane\", \"safe teardown\", \"run remover.sh\", \"run remove_controlplane.sh\", \"destroy left resources behind\", \"the control-plane removal said success but the deployer is still there\".",{"type":42,"tag":50,"props":68,"children":69},{},[70],{"type":47,"value":71},"Do NOT trigger on: explicit Terraform state surgery, generic failed-run triage, or greenfield deployment.",{"type":42,"tag":56,"props":73,"children":75},{"id":74},"preconditions",[76],{"type":47,"value":77},"Preconditions",{"type":42,"tag":79,"props":80,"children":81},"ul",{},[82,105,117,144],{"type":42,"tag":83,"props":84,"children":85},"li",{},[86,88,95,97,103],{"type":47,"value":87},"Approved removal scope, maintenance window, identity, and retention plan (",{"type":42,"tag":89,"props":90,"children":92},"code",{"className":91},[],[93],{"type":47,"value":94},"docs\u002Flocal\u002F07-00-operations.md § Inputs",{"type":47,"value":96},", ",{"type":42,"tag":89,"props":98,"children":100},{"className":99},[],[101],{"type":47,"value":102},"§ Prepare an operational change",{"type":47,"value":104},").",{"type":42,"tag":83,"props":106,"children":107},{},[108,110,116],{"type":47,"value":109},"SAP and database services stopped per product procedures, and business data, configuration, keys, logs, and state evidence backed up (",{"type":42,"tag":89,"props":111,"children":113},{"className":112},[],[114],{"type":47,"value":115},"§ Remove resources",{"type":47,"value":104},{"type":42,"tag":83,"props":118,"children":119},{},[120,122,128,130,136,137,143],{"type":47,"value":121},"Keep the approved SDAF commit, configuration revision, remote-state account, state keys, ",{"type":42,"tag":89,"props":123,"children":125},{"className":124},[],[126],{"type":47,"value":127},".sap_deployment_automation",{"type":47,"value":129}," metadata, and destroy output (",{"type":42,"tag":89,"props":131,"children":133},{"className":132},[],[134],{"type":47,"value":135},"§ Before you begin",{"type":47,"value":96},{"type":42,"tag":89,"props":138,"children":140},{"className":139},[],[141],{"type":47,"value":142},"§ Retain logs and evidence",{"type":47,"value":104},{"type":42,"tag":83,"props":145,"children":146},{},[147,149,155],{"type":47,"value":148},"Run the stage script from the directory that contains the parameter file and pass the basename only (",{"type":42,"tag":89,"props":150,"children":152},{"className":151},[],[153],{"type":47,"value":154},"docs\u002Flocal\u002Ftroubleshooting.md § A parameter file is not found",{"type":47,"value":104},{"type":42,"tag":56,"props":157,"children":159},{"id":158},"reverse-order-guard",[160],{"type":47,"value":161},"Reverse-order guard",{"type":42,"tag":50,"props":163,"children":164},{},[165,167,173],{"type":47,"value":166},"Apply this order on every teardown (",{"type":42,"tag":89,"props":168,"children":170},{"className":169},[],[171],{"type":47,"value":172},"docs\u002Flocal\u002F07-00-operations.md § Remove resources",{"type":47,"value":174},"):",{"type":42,"tag":176,"props":177,"children":178},"ol",{},[179,184,189,194],{"type":42,"tag":83,"props":180,"children":181},{},[182],{"type":47,"value":183},"Remove each SAP system.",{"type":42,"tag":83,"props":185,"children":186},{},[187],{"type":47,"value":188},"Remove workload-zone resources only after every dependent SAP system is removed.",{"type":42,"tag":83,"props":190,"children":191},{},[192],{"type":47,"value":193},"Remove the control plane only after every dependent workload zone is removed.",{"type":42,"tag":83,"props":195,"children":196},{},[197],{"type":47,"value":198},"Remove retained shared or external resources separately according to their ownership.",{"type":42,"tag":50,"props":200,"children":201},{},[202],{"type":47,"value":203},"Do not continue to a broader scope until the narrower dependency is gone and the destroy output has been reviewed.",{"type":42,"tag":56,"props":205,"children":207},{"id":206},"run-one-approved-removal-stage-at-a-time",[208],{"type":47,"value":209},"Run one approved removal stage at a time",{"type":42,"tag":211,"props":212,"children":214},"h3",{"id":213},"remove-an-sap-system",[215],{"type":47,"value":216},"Remove an SAP system",{"type":42,"tag":50,"props":218,"children":219},{},[220,222,228,230,236],{"type":47,"value":221},"From ",{"type":42,"tag":89,"props":223,"children":225},{"className":224},[],[226],{"type":47,"value":227},"WORKSPACES\u002FSYSTEM\u002F\u003CSAP_SYSTEM>",{"type":47,"value":229},", exactly per ",{"type":42,"tag":89,"props":231,"children":233},{"className":232},[],[234],{"type":47,"value":235},"docs\u002Flocal\u002F07-00-operations.md § Remove an SAP system",{"type":47,"value":237},":",{"type":42,"tag":239,"props":240,"children":245},"pre",{"className":241,"code":242,"language":243,"meta":244,"style":244},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","cd \"$CONFIG_REPO_PATH\u002FWORKSPACES\u002FSYSTEM\u002F\u003CSAP_SYSTEM>\"\nARM_SUBSCRIPTION_ID=\"\u003CWORKLOAD_SUBSCRIPTION_ID>\" \\\n\"$SAP_AUTOMATION_REPO_PATH\u002Fdeploy\u002Fscripts\u002Fremover.sh\" \\\n  --type sap_system \\\n  --parameterfile \"\u003CSAP_SYSTEM>.tfvars\" \\\n  --control_plane_name \"\u003CCONTROL_PLANE>\" \\\n  --deployer_tfstate_key \"\u003CDEPLOYER_STATE_KEY>\" \\\n  --landscape_tfstate_key \"\u003CLANDSCAPE_STATE_KEY>\" \\\n  --storageaccountname \"\u003CSTATE_STORAGE_ACCOUNT>\" \\\n  --state_subscription \"\u003CSTATE_SUBSCRIPTION_ID>\"\n","bash","",[246],{"type":42,"tag":89,"props":247,"children":248},{"__ignoreMap":244},[249,284,318,344,362,388,414,440,466,492],{"type":42,"tag":250,"props":251,"children":254},"span",{"class":252,"line":253},"line",1,[255,261,267,273,279],{"type":42,"tag":250,"props":256,"children":258},{"style":257},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[259],{"type":47,"value":260},"cd",{"type":42,"tag":250,"props":262,"children":264},{"style":263},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[265],{"type":47,"value":266}," \"",{"type":42,"tag":250,"props":268,"children":270},{"style":269},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[271],{"type":47,"value":272},"$CONFIG_REPO_PATH",{"type":42,"tag":250,"props":274,"children":276},{"style":275},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[277],{"type":47,"value":278},"\u002FWORKSPACES\u002FSYSTEM\u002F\u003CSAP_SYSTEM>",{"type":42,"tag":250,"props":280,"children":281},{"style":263},[282],{"type":47,"value":283},"\"\n",{"type":42,"tag":250,"props":285,"children":287},{"class":252,"line":286},2,[288,293,298,303,308,312],{"type":42,"tag":250,"props":289,"children":290},{"style":269},[291],{"type":47,"value":292},"ARM_SUBSCRIPTION_ID",{"type":42,"tag":250,"props":294,"children":295},{"style":263},[296],{"type":47,"value":297},"=",{"type":42,"tag":250,"props":299,"children":300},{"style":263},[301],{"type":47,"value":302},"\"",{"type":42,"tag":250,"props":304,"children":305},{"style":275},[306],{"type":47,"value":307},"\u003CWORKLOAD_SUBSCRIPTION_ID>",{"type":42,"tag":250,"props":309,"children":310},{"style":263},[311],{"type":47,"value":302},{"type":42,"tag":250,"props":313,"children":315},{"style":314},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[316],{"type":47,"value":317}," \\\n",{"type":42,"tag":250,"props":319,"children":321},{"class":252,"line":320},3,[322,326,331,336,340],{"type":42,"tag":250,"props":323,"children":324},{"style":263},[325],{"type":47,"value":302},{"type":42,"tag":250,"props":327,"children":328},{"style":269},[329],{"type":47,"value":330},"$SAP_AUTOMATION_REPO_PATH",{"type":42,"tag":250,"props":332,"children":333},{"style":275},[334],{"type":47,"value":335},"\u002Fdeploy\u002Fscripts\u002Fremover.sh",{"type":42,"tag":250,"props":337,"children":338},{"style":263},[339],{"type":47,"value":302},{"type":42,"tag":250,"props":341,"children":342},{"style":269},[343],{"type":47,"value":317},{"type":42,"tag":250,"props":345,"children":347},{"class":252,"line":346},4,[348,353,358],{"type":42,"tag":250,"props":349,"children":350},{"style":275},[351],{"type":47,"value":352},"  --type",{"type":42,"tag":250,"props":354,"children":355},{"style":275},[356],{"type":47,"value":357}," sap_system",{"type":42,"tag":250,"props":359,"children":360},{"style":269},[361],{"type":47,"value":317},{"type":42,"tag":250,"props":363,"children":365},{"class":252,"line":364},5,[366,371,375,380,384],{"type":42,"tag":250,"props":367,"children":368},{"style":275},[369],{"type":47,"value":370},"  --parameterfile",{"type":42,"tag":250,"props":372,"children":373},{"style":263},[374],{"type":47,"value":266},{"type":42,"tag":250,"props":376,"children":377},{"style":275},[378],{"type":47,"value":379},"\u003CSAP_SYSTEM>.tfvars",{"type":42,"tag":250,"props":381,"children":382},{"style":263},[383],{"type":47,"value":302},{"type":42,"tag":250,"props":385,"children":386},{"style":269},[387],{"type":47,"value":317},{"type":42,"tag":250,"props":389,"children":391},{"class":252,"line":390},6,[392,397,401,406,410],{"type":42,"tag":250,"props":393,"children":394},{"style":275},[395],{"type":47,"value":396},"  --control_plane_name",{"type":42,"tag":250,"props":398,"children":399},{"style":263},[400],{"type":47,"value":266},{"type":42,"tag":250,"props":402,"children":403},{"style":275},[404],{"type":47,"value":405},"\u003CCONTROL_PLANE>",{"type":42,"tag":250,"props":407,"children":408},{"style":263},[409],{"type":47,"value":302},{"type":42,"tag":250,"props":411,"children":412},{"style":269},[413],{"type":47,"value":317},{"type":42,"tag":250,"props":415,"children":417},{"class":252,"line":416},7,[418,423,427,432,436],{"type":42,"tag":250,"props":419,"children":420},{"style":275},[421],{"type":47,"value":422},"  --deployer_tfstate_key",{"type":42,"tag":250,"props":424,"children":425},{"style":263},[426],{"type":47,"value":266},{"type":42,"tag":250,"props":428,"children":429},{"style":275},[430],{"type":47,"value":431},"\u003CDEPLOYER_STATE_KEY>",{"type":42,"tag":250,"props":433,"children":434},{"style":263},[435],{"type":47,"value":302},{"type":42,"tag":250,"props":437,"children":438},{"style":269},[439],{"type":47,"value":317},{"type":42,"tag":250,"props":441,"children":443},{"class":252,"line":442},8,[444,449,453,458,462],{"type":42,"tag":250,"props":445,"children":446},{"style":275},[447],{"type":47,"value":448},"  --landscape_tfstate_key",{"type":42,"tag":250,"props":450,"children":451},{"style":263},[452],{"type":47,"value":266},{"type":42,"tag":250,"props":454,"children":455},{"style":275},[456],{"type":47,"value":457},"\u003CLANDSCAPE_STATE_KEY>",{"type":42,"tag":250,"props":459,"children":460},{"style":263},[461],{"type":47,"value":302},{"type":42,"tag":250,"props":463,"children":464},{"style":269},[465],{"type":47,"value":317},{"type":42,"tag":250,"props":467,"children":469},{"class":252,"line":468},9,[470,475,479,484,488],{"type":42,"tag":250,"props":471,"children":472},{"style":275},[473],{"type":47,"value":474},"  --storageaccountname",{"type":42,"tag":250,"props":476,"children":477},{"style":263},[478],{"type":47,"value":266},{"type":42,"tag":250,"props":480,"children":481},{"style":275},[482],{"type":47,"value":483},"\u003CSTATE_STORAGE_ACCOUNT>",{"type":42,"tag":250,"props":485,"children":486},{"style":263},[487],{"type":47,"value":302},{"type":42,"tag":250,"props":489,"children":490},{"style":269},[491],{"type":47,"value":317},{"type":42,"tag":250,"props":493,"children":495},{"class":252,"line":494},10,[496,501,505,510],{"type":42,"tag":250,"props":497,"children":498},{"style":275},[499],{"type":47,"value":500},"  --state_subscription",{"type":42,"tag":250,"props":502,"children":503},{"style":263},[504],{"type":47,"value":266},{"type":42,"tag":250,"props":506,"children":507},{"style":275},[508],{"type":47,"value":509},"\u003CSTATE_SUBSCRIPTION_ID>",{"type":42,"tag":250,"props":511,"children":512},{"style":263},[513],{"type":47,"value":283},{"type":42,"tag":50,"props":515,"children":516},{},[517],{"type":47,"value":518},"Review the destroy plan and confirm only after backups and approvals are complete.",{"type":42,"tag":211,"props":520,"children":522},{"id":521},"remove-a-workload-zone",[523],{"type":47,"value":524},"Remove a workload zone",{"type":42,"tag":50,"props":526,"children":527},{},[528,530,536,537,543],{"type":47,"value":529},"Only after every dependent SAP system is removed. From ",{"type":42,"tag":89,"props":531,"children":533},{"className":532},[],[534],{"type":47,"value":535},"WORKSPACES\u002FLANDSCAPE\u002F\u003CWORKLOAD_ZONE>-INFRASTRUCTURE",{"type":47,"value":229},{"type":42,"tag":89,"props":538,"children":540},{"className":539},[],[541],{"type":47,"value":542},"docs\u002Flocal\u002F07-00-operations.md § Remove a workload zone",{"type":47,"value":237},{"type":42,"tag":239,"props":545,"children":547},{"className":241,"code":546,"language":243,"meta":244,"style":244},"cd \"$CONFIG_REPO_PATH\u002FWORKSPACES\u002FLANDSCAPE\u002F\u003CWORKLOAD_ZONE>-INFRASTRUCTURE\"\nARM_SUBSCRIPTION_ID=\"\u003CWORKLOAD_SUBSCRIPTION_ID>\" \\\n\"$SAP_AUTOMATION_REPO_PATH\u002Fdeploy\u002Fscripts\u002Fremover.sh\" \\\n  --type sap_landscape \\\n  --parameterfile \"\u003CWORKLOAD_ZONE>-INFRASTRUCTURE.tfvars\" \\\n  --control_plane_name \"\u003CCONTROL_PLANE>\" \\\n  --deployer_tfstate_key \"\u003CDEPLOYER_STATE_KEY>\" \\\n  --storageaccountname \"\u003CSTATE_STORAGE_ACCOUNT>\" \\\n  --state_subscription \"\u003CSTATE_SUBSCRIPTION_ID>\"\n",[548],{"type":42,"tag":89,"props":549,"children":550},{"__ignoreMap":244},[551,575,602,625,641,665,688,711,734],{"type":42,"tag":250,"props":552,"children":553},{"class":252,"line":253},[554,558,562,566,571],{"type":42,"tag":250,"props":555,"children":556},{"style":257},[557],{"type":47,"value":260},{"type":42,"tag":250,"props":559,"children":560},{"style":263},[561],{"type":47,"value":266},{"type":42,"tag":250,"props":563,"children":564},{"style":269},[565],{"type":47,"value":272},{"type":42,"tag":250,"props":567,"children":568},{"style":275},[569],{"type":47,"value":570},"\u002FWORKSPACES\u002FLANDSCAPE\u002F\u003CWORKLOAD_ZONE>-INFRASTRUCTURE",{"type":42,"tag":250,"props":572,"children":573},{"style":263},[574],{"type":47,"value":283},{"type":42,"tag":250,"props":576,"children":577},{"class":252,"line":286},[578,582,586,590,594,598],{"type":42,"tag":250,"props":579,"children":580},{"style":269},[581],{"type":47,"value":292},{"type":42,"tag":250,"props":583,"children":584},{"style":263},[585],{"type":47,"value":297},{"type":42,"tag":250,"props":587,"children":588},{"style":263},[589],{"type":47,"value":302},{"type":42,"tag":250,"props":591,"children":592},{"style":275},[593],{"type":47,"value":307},{"type":42,"tag":250,"props":595,"children":596},{"style":263},[597],{"type":47,"value":302},{"type":42,"tag":250,"props":599,"children":600},{"style":314},[601],{"type":47,"value":317},{"type":42,"tag":250,"props":603,"children":604},{"class":252,"line":320},[605,609,613,617,621],{"type":42,"tag":250,"props":606,"children":607},{"style":263},[608],{"type":47,"value":302},{"type":42,"tag":250,"props":610,"children":611},{"style":269},[612],{"type":47,"value":330},{"type":42,"tag":250,"props":614,"children":615},{"style":275},[616],{"type":47,"value":335},{"type":42,"tag":250,"props":618,"children":619},{"style":263},[620],{"type":47,"value":302},{"type":42,"tag":250,"props":622,"children":623},{"style":269},[624],{"type":47,"value":317},{"type":42,"tag":250,"props":626,"children":627},{"class":252,"line":346},[628,632,637],{"type":42,"tag":250,"props":629,"children":630},{"style":275},[631],{"type":47,"value":352},{"type":42,"tag":250,"props":633,"children":634},{"style":275},[635],{"type":47,"value":636}," sap_landscape",{"type":42,"tag":250,"props":638,"children":639},{"style":269},[640],{"type":47,"value":317},{"type":42,"tag":250,"props":642,"children":643},{"class":252,"line":364},[644,648,652,657,661],{"type":42,"tag":250,"props":645,"children":646},{"style":275},[647],{"type":47,"value":370},{"type":42,"tag":250,"props":649,"children":650},{"style":263},[651],{"type":47,"value":266},{"type":42,"tag":250,"props":653,"children":654},{"style":275},[655],{"type":47,"value":656},"\u003CWORKLOAD_ZONE>-INFRASTRUCTURE.tfvars",{"type":42,"tag":250,"props":658,"children":659},{"style":263},[660],{"type":47,"value":302},{"type":42,"tag":250,"props":662,"children":663},{"style":269},[664],{"type":47,"value":317},{"type":42,"tag":250,"props":666,"children":667},{"class":252,"line":390},[668,672,676,680,684],{"type":42,"tag":250,"props":669,"children":670},{"style":275},[671],{"type":47,"value":396},{"type":42,"tag":250,"props":673,"children":674},{"style":263},[675],{"type":47,"value":266},{"type":42,"tag":250,"props":677,"children":678},{"style":275},[679],{"type":47,"value":405},{"type":42,"tag":250,"props":681,"children":682},{"style":263},[683],{"type":47,"value":302},{"type":42,"tag":250,"props":685,"children":686},{"style":269},[687],{"type":47,"value":317},{"type":42,"tag":250,"props":689,"children":690},{"class":252,"line":416},[691,695,699,703,707],{"type":42,"tag":250,"props":692,"children":693},{"style":275},[694],{"type":47,"value":422},{"type":42,"tag":250,"props":696,"children":697},{"style":263},[698],{"type":47,"value":266},{"type":42,"tag":250,"props":700,"children":701},{"style":275},[702],{"type":47,"value":431},{"type":42,"tag":250,"props":704,"children":705},{"style":263},[706],{"type":47,"value":302},{"type":42,"tag":250,"props":708,"children":709},{"style":269},[710],{"type":47,"value":317},{"type":42,"tag":250,"props":712,"children":713},{"class":252,"line":442},[714,718,722,726,730],{"type":42,"tag":250,"props":715,"children":716},{"style":275},[717],{"type":47,"value":474},{"type":42,"tag":250,"props":719,"children":720},{"style":263},[721],{"type":47,"value":266},{"type":42,"tag":250,"props":723,"children":724},{"style":275},[725],{"type":47,"value":483},{"type":42,"tag":250,"props":727,"children":728},{"style":263},[729],{"type":47,"value":302},{"type":42,"tag":250,"props":731,"children":732},{"style":269},[733],{"type":47,"value":317},{"type":42,"tag":250,"props":735,"children":736},{"class":252,"line":468},[737,741,745,749],{"type":42,"tag":250,"props":738,"children":739},{"style":275},[740],{"type":47,"value":500},{"type":42,"tag":250,"props":742,"children":743},{"style":263},[744],{"type":47,"value":266},{"type":42,"tag":250,"props":746,"children":747},{"style":275},[748],{"type":47,"value":509},{"type":42,"tag":250,"props":750,"children":751},{"style":263},[752],{"type":47,"value":283},{"type":42,"tag":50,"props":754,"children":755},{},[756],{"type":47,"value":757},"Confirm the workload-zone state and any retained shared resources match the approved removal scope before approval.",{"type":42,"tag":211,"props":759,"children":761},{"id":760},"remove-the-control-plane",[762],{"type":47,"value":763},"Remove the control plane",{"type":42,"tag":50,"props":765,"children":766},{},[767,769,775,776,782],{"type":47,"value":768},"Only after every dependent workload zone is removed. From ",{"type":42,"tag":89,"props":770,"children":772},{"className":771},[],[773],{"type":47,"value":774},"WORKSPACES",{"type":47,"value":229},{"type":42,"tag":89,"props":777,"children":779},{"className":778},[],[780],{"type":47,"value":781},"docs\u002Flocal\u002F07-00-operations.md § Remove the control plane",{"type":47,"value":237},{"type":42,"tag":239,"props":784,"children":786},{"className":241,"code":785,"language":243,"meta":244,"style":244},"cd \"$CONFIG_REPO_PATH\u002FWORKSPACES\"\n\"$SAP_AUTOMATION_REPO_PATH\u002Fdeploy\u002Fscripts\u002Fremove_controlplane.sh\" \\\n  --deployer_parameter_file \\\n  \"$CONFIG_REPO_PATH\u002FWORKSPACES\u002FDEPLOYER\u002F\u003CCONTROL_PLANE>-INFRASTRUCTURE\u002F\u003CCONTROL_PLANE>-INFRASTRUCTURE.tfvars\" \\\n  --library_parameter_file \\\n  \"$CONFIG_REPO_PATH\u002FWORKSPACES\u002FLIBRARY\u002F\u003CENVIRONMENT>-\u003CLOCATION>-SAP_LIBRARY\u002F\u003CENVIRONMENT>-\u003CLOCATION>-SAP_LIBRARY.tfvars\"\n",[787],{"type":42,"tag":89,"props":788,"children":789},{"__ignoreMap":244},[790,814,834,846,871,883],{"type":42,"tag":250,"props":791,"children":792},{"class":252,"line":253},[793,797,801,805,810],{"type":42,"tag":250,"props":794,"children":795},{"style":257},[796],{"type":47,"value":260},{"type":42,"tag":250,"props":798,"children":799},{"style":263},[800],{"type":47,"value":266},{"type":42,"tag":250,"props":802,"children":803},{"style":269},[804],{"type":47,"value":272},{"type":42,"tag":250,"props":806,"children":807},{"style":275},[808],{"type":47,"value":809},"\u002FWORKSPACES",{"type":42,"tag":250,"props":811,"children":812},{"style":263},[813],{"type":47,"value":283},{"type":42,"tag":250,"props":815,"children":816},{"class":252,"line":286},[817,821,825,830],{"type":42,"tag":250,"props":818,"children":819},{"style":314},[820],{"type":47,"value":302},{"type":42,"tag":250,"props":822,"children":823},{"style":269},[824],{"type":47,"value":330},{"type":42,"tag":250,"props":826,"children":827},{"style":314},[828],{"type":47,"value":829},"\u002Fdeploy\u002Fscripts\u002Fremove_controlplane.sh\"",{"type":42,"tag":250,"props":831,"children":832},{"style":269},[833],{"type":47,"value":317},{"type":42,"tag":250,"props":835,"children":836},{"class":252,"line":320},[837,842],{"type":42,"tag":250,"props":838,"children":839},{"style":275},[840],{"type":47,"value":841},"  --deployer_parameter_file",{"type":42,"tag":250,"props":843,"children":844},{"style":269},[845],{"type":47,"value":317},{"type":42,"tag":250,"props":847,"children":848},{"class":252,"line":346},[849,854,858,863,867],{"type":42,"tag":250,"props":850,"children":851},{"style":263},[852],{"type":47,"value":853},"  \"",{"type":42,"tag":250,"props":855,"children":856},{"style":269},[857],{"type":47,"value":272},{"type":42,"tag":250,"props":859,"children":860},{"style":275},[861],{"type":47,"value":862},"\u002FWORKSPACES\u002FDEPLOYER\u002F\u003CCONTROL_PLANE>-INFRASTRUCTURE\u002F\u003CCONTROL_PLANE>-INFRASTRUCTURE.tfvars",{"type":42,"tag":250,"props":864,"children":865},{"style":263},[866],{"type":47,"value":302},{"type":42,"tag":250,"props":868,"children":869},{"style":269},[870],{"type":47,"value":317},{"type":42,"tag":250,"props":872,"children":873},{"class":252,"line":364},[874,879],{"type":42,"tag":250,"props":875,"children":876},{"style":275},[877],{"type":47,"value":878},"  --library_parameter_file",{"type":42,"tag":250,"props":880,"children":881},{"style":269},[882],{"type":47,"value":317},{"type":42,"tag":250,"props":884,"children":885},{"class":252,"line":390},[886,890,894,899],{"type":42,"tag":250,"props":887,"children":888},{"style":263},[889],{"type":47,"value":853},{"type":42,"tag":250,"props":891,"children":892},{"style":269},[893],{"type":47,"value":272},{"type":42,"tag":250,"props":895,"children":896},{"style":275},[897],{"type":47,"value":898},"\u002FWORKSPACES\u002FLIBRARY\u002F\u003CENVIRONMENT>-\u003CLOCATION>-SAP_LIBRARY\u002F\u003CENVIRONMENT>-\u003CLOCATION>-SAP_LIBRARY.tfvars",{"type":42,"tag":250,"props":900,"children":901},{"style":263},[902],{"type":47,"value":283},{"type":42,"tag":50,"props":904,"children":905},{},[906,908,914,916,921],{"type":47,"value":907},"Review each destroy operation. Use ",{"type":42,"tag":89,"props":909,"children":911},{"className":910},[],[912],{"type":47,"value":913},"--keep_agent",{"type":47,"value":915}," only when the deployment agent retention was explicitly approved and you understand the resulting partial removal (",{"type":42,"tag":89,"props":917,"children":919},{"className":918},[],[920],{"type":47,"value":781},{"type":47,"value":104},{"type":42,"tag":56,"props":923,"children":925},{"id":924},"if-removal-is-incomplete",[926],{"type":47,"value":927},"If removal is incomplete",{"type":42,"tag":50,"props":929,"children":930},{},[931,937],{"type":42,"tag":89,"props":932,"children":934},{"className":933},[],[935],{"type":47,"value":936},"docs\u002Flocal\u002Ftroubleshooting.md § Removal is incomplete",{"type":47,"value":938}," is canonical:",{"type":42,"tag":176,"props":940,"children":941},{},[942,947,952,957,962],{"type":42,"tag":83,"props":943,"children":944},{},[945],{"type":47,"value":946},"Preserve the destroy output.",{"type":42,"tag":83,"props":948,"children":949},{},[950],{"type":47,"value":951},"Confirm the dependency order was respected.",{"type":42,"tag":83,"props":953,"children":954},{},[955],{"type":47,"value":956},"Compare remaining Azure resources with the Terraform state list.",{"type":42,"tag":83,"props":958,"children":959},{},[960],{"type":47,"value":961},"Resolve locks, permissions, policies, and delete protections.",{"type":42,"tag":83,"props":963,"children":964},{},[965],{"type":47,"value":966},"For an SAP-system or workload-zone removal, rerun the same command and re-review the destroy plan.",{"type":42,"tag":211,"props":968,"children":970},{"id":969},"control-plane-partial-removal-trap",[971],{"type":47,"value":972},"Control-plane partial-removal trap",{"type":42,"tag":50,"props":974,"children":975},{},[976,978,984,986,992,994,1000,1002,1008,1009,1014],{"type":47,"value":977},"Do ",{"type":42,"tag":979,"props":980,"children":981},"strong",{},[982],{"type":47,"value":983},"not",{"type":47,"value":985}," use the generic rerun rule for an interrupted control-plane removal. Inspect ",{"type":42,"tag":89,"props":987,"children":989},{"className":988},[],[990],{"type":47,"value":991},"$CONFIG_REPO_PATH\u002F.sap_deployment_automation",{"type":47,"value":993},", its persisted ",{"type":42,"tag":89,"props":995,"children":997},{"className":996},[],[998],{"type":47,"value":999},"step",{"type":47,"value":1001},", the library destroy result, and the remaining deployer state and resources (",{"type":42,"tag":89,"props":1003,"children":1005},{"className":1004},[],[1006],{"type":47,"value":1007},"docs\u002Flocal\u002F07-00-operations.md § Retry deterministically",{"type":47,"value":96},{"type":42,"tag":89,"props":1010,"children":1012},{"className":1011},[],[1013],{"type":47,"value":936},{"type":47,"value":104},{"type":42,"tag":50,"props":1016,"children":1017},{},[1018,1020,1026,1028,1034],{"type":47,"value":1019},"After the library destroy, ",{"type":42,"tag":89,"props":1021,"children":1023},{"className":1022},[],[1024],{"type":47,"value":1025},"remove_controlplane.sh",{"type":47,"value":1027}," persists ",{"type":42,"tag":89,"props":1029,"children":1031},{"className":1030},[],[1032],{"type":47,"value":1033},"step=1",{"type":47,"value":1035},"; a later invocation can exit successfully without destroying the deployer. Do not treat that exit as completion, do not edit the step to bypass the guard, and do not switch to ad-hoc resource-group deletion. Obtain expert review for a component-specific recovery path.",{"type":42,"tag":56,"props":1037,"children":1039},{"id":1038},"arm-fallback-last-resort-azure-devops-only",[1040],{"type":47,"value":1041},"ARM fallback — last resort, Azure DevOps only",{"type":42,"tag":50,"props":1043,"children":1044},{},[1045,1047,1052],{"type":47,"value":1046},"The only documented ARM fallback here is the Azure DevOps removal fallback.\nIt removes SAP systems, the workload zone, and the region through ARM\nresource-group deletion and is a fallback ",{"type":42,"tag":979,"props":1048,"children":1049},{},[1050],{"type":47,"value":1051},"only",{"type":47,"value":1053}," when Terraform destroy does\nnot remove everything.",{"type":42,"tag":50,"props":1055,"children":1056},{},[1057],{"type":47,"value":1058},"Use that pipeline only after:",{"type":42,"tag":79,"props":1060,"children":1061},{},[1062,1067,1072,1077],{"type":42,"tag":83,"props":1063,"children":1064},{},[1065],{"type":47,"value":1066},"the normal reverse-order Terraform removal path was attempted,",{"type":42,"tag":83,"props":1068,"children":1069},{},[1070],{"type":47,"value":1071},"the destroy output was captured and reviewed,",{"type":42,"tag":83,"props":1073,"children":1074},{},[1075],{"type":47,"value":1076},"the approved scope still matches the remaining resource groups, and",{"type":42,"tag":83,"props":1078,"children":1079},{},[1080],{"type":47,"value":1081},"the operator explicitly approves a resource-group deletion fallback.",{"type":42,"tag":50,"props":1083,"children":1084},{},[1085],{"type":47,"value":1086},"This repo does not document a local-script or GitHub Actions ARM-fallback procedure. Do not invent one.",{"type":42,"tag":56,"props":1088,"children":1090},{"id":1089},"hard-rules",[1091],{"type":47,"value":1092},"Hard rules",{"type":42,"tag":79,"props":1094,"children":1095},{},[1096,1116,1127,1171,1191,1196],{"type":42,"tag":83,"props":1097,"children":1098},{},[1099,1101,1107,1109,1115],{"type":47,"value":1100},"Do not pass ",{"type":42,"tag":89,"props":1102,"children":1104},{"className":1103},[],[1105],{"type":47,"value":1106},"--auto-approve",{"type":47,"value":1108}," (",{"type":42,"tag":89,"props":1110,"children":1112},{"className":1111},[],[1113],{"type":47,"value":1114},"docs\u002Flocal\u002F07-00-operations.md § Review before execution",{"type":47,"value":104},{"type":42,"tag":83,"props":1117,"children":1118},{},[1119,1121,1126],{"type":47,"value":1120},"Do not remove the remote-state account or edit state to hide a failure (",{"type":42,"tag":89,"props":1122,"children":1124},{"className":1123},[],[1125],{"type":47,"value":936},{"type":47,"value":104},{"type":42,"tag":83,"props":1128,"children":1129},{},[1130,1132,1138,1140,1146,1148,1154,1155,1161,1163,1169],{"type":47,"value":1131},"Do not run ad-hoc ",{"type":42,"tag":89,"props":1133,"children":1135},{"className":1134},[],[1136],{"type":47,"value":1137},"az group delete",{"type":47,"value":1139},", direct ARM deletion, or explicit Terraform state ",{"type":42,"tag":89,"props":1141,"children":1143},{"className":1142},[],[1144],{"type":47,"value":1145},"list",{"type":47,"value":1147}," \u002F ",{"type":42,"tag":89,"props":1149,"children":1151},{"className":1150},[],[1152],{"type":47,"value":1153},"import",{"type":47,"value":1147},{"type":42,"tag":89,"props":1156,"children":1158},{"className":1157},[],[1159],{"type":47,"value":1160},"remove",{"type":47,"value":1162}," commands in place of the documented sequence; the state-operation boundary belongs to ",{"type":42,"tag":89,"props":1164,"children":1166},{"className":1165},[],[1167],{"type":47,"value":1168},"sdaf-state-management",{"type":47,"value":1170},".",{"type":42,"tag":83,"props":1172,"children":1173},{},[1174,1176,1182,1184,1189],{"type":47,"value":1175},"Do not treat a control-plane rerun that exits ",{"type":42,"tag":89,"props":1177,"children":1179},{"className":1178},[],[1180],{"type":47,"value":1181},"0",{"type":47,"value":1183}," after ",{"type":42,"tag":89,"props":1185,"children":1187},{"className":1186},[],[1188],{"type":47,"value":1033},{"type":47,"value":1190}," as completed removal.",{"type":42,"tag":83,"props":1192,"children":1193},{},[1194],{"type":47,"value":1195},"Documented behaviour only; if the docs or shipped scripts are silent, stop.",{"type":42,"tag":83,"props":1197,"children":1198},{},[1199,1201,1212],{"type":47,"value":1200},"Repo-wide rules apply: follow ",{"type":42,"tag":1202,"props":1203,"children":1205},"a",{"href":1204},"..\u002F..\u002F.github\u002Fcopilot-instructions.md",[1206],{"type":42,"tag":89,"props":1207,"children":1209},{"className":1208},[],[1210],{"type":47,"value":1211},".github\u002Fcopilot-instructions.md",{"type":47,"value":1170},{"type":42,"tag":56,"props":1214,"children":1216},{"id":1215},"see-also",[1217],{"type":47,"value":1218},"See also",{"type":42,"tag":79,"props":1220,"children":1221},{},[1222,1259],{"type":42,"tag":83,"props":1223,"children":1224},{},[1225,1230,1231,1237,1238,1244,1245,1251,1252,1258],{"type":42,"tag":89,"props":1226,"children":1228},{"className":1227},[],[1229],{"type":47,"value":1168},{"type":47,"value":96},{"type":42,"tag":89,"props":1232,"children":1234},{"className":1233},[],[1235],{"type":47,"value":1236},"sdaf-failure-triage",{"type":47,"value":96},{"type":42,"tag":89,"props":1239,"children":1241},{"className":1240},[],[1242],{"type":47,"value":1243},"sdaf-control-plane-bootstrap",{"type":47,"value":96},{"type":42,"tag":89,"props":1246,"children":1248},{"className":1247},[],[1249],{"type":47,"value":1250},"sdaf-workload-zone",{"type":47,"value":96},{"type":42,"tag":89,"props":1253,"children":1255},{"className":1254},[],[1256],{"type":47,"value":1257},"sdaf-sap-system",{"type":47,"value":1170},{"type":42,"tag":83,"props":1260,"children":1261},{},[1262,1268,1269,1275,1277,1283],{"type":42,"tag":89,"props":1263,"children":1265},{"className":1264},[],[1266],{"type":47,"value":1267},"docs\u002Flocal\u002F07-00-operations.md",{"type":47,"value":96},{"type":42,"tag":89,"props":1270,"children":1272},{"className":1271},[],[1273],{"type":47,"value":1274},"docs\u002Flocal\u002Ftroubleshooting.md",{"type":47,"value":1276},", and\n",{"type":42,"tag":89,"props":1278,"children":1280},{"className":1279},[],[1281],{"type":47,"value":1282},"docs\u002Flocal\u002FREADME.md",{"type":47,"value":1170},{"type":42,"tag":1285,"props":1286,"children":1287},"style",{},[1288],{"type":47,"value":1289},"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":1291,"total":1378},[1292,1304,1316,1331,1342,1355,1365],{"slug":1293,"name":1293,"fn":1294,"description":1295,"org":1296,"tags":1297,"stars":24,"repoUrl":25,"updatedAt":1303},"sdaf-bom-selection","select SAP Bill of Materials","Pick the right SDAF BOM for a target SAP product \u002F release \u002F DB platform \u002F version \u002F kernel \u002F topology. Explains where BOMs live in the samples repo (`SAP\u002F` for whole products, `BOM\u002F` for components), decodes the `ms`, `v####`, and `latest` suffix conventions, points at the compatibility guardrails (`supportedPlatforms`, `supportedDBVersions`, `supportedKernels`), and reminds the operator that the download flow needs four explicit BOM keys in `sap-parameters.yaml`. Use when a user says \"which BOM do I use\", \"product BOM vs component BOM\", \"SAP samples BOM catalog\", \"BOM_CATALOG\", \"S4\u002F2023 BOM\", \"HANA BOM\", or \"how do I pick a BOM for HANA\u002FOracle\u002FDB2\u002FASE\". Do NOT use to author a new BOM, to acquire media (`sdaf-media-acquisition`), or to troubleshoot a checksum \u002F 404 (`sdaf-media-diagnostics`).\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1298,1299,1302],{"name":11,"slug":8,"type":16},{"name":1300,"slug":1301,"type":16},"Configuration","configuration",{"name":19,"slug":20,"type":16},"2026-09-02T07:47:45.597063",{"slug":1243,"name":1243,"fn":1305,"description":1306,"org":1307,"tags":1308,"stars":24,"repoUrl":25,"updatedAt":1315},"deploy SDAF control plane infrastructure","Deploy the SDAF control plane locally: prepare DEPLOYER and LIBRARY tfvars, review the plan, run `deploy_controlplane.sh` per `docs\u002Flocal\u002F03-00-control-plane.md § Run`, and validate the deployer + library + state hand-off. Grounded in `docs\u002Flocal\u002F03-00-control-plane.md`. Use when a user says \"deploy the SDAF control plane\", \"run deploy_controlplane.sh\", \"bootstrap SDAF from an empty subscription\", \"install the deployer\" or \"create the SAP library\". Do NOT use for workload zone (see sdaf-workload-zone), SAP system (see sdaf-sap-system), removal (`sdaf-safe-removal`), or Azure Government \u002F sovereign-cloud deltas (`sdaf-sovereign-cloud`).\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1309,1310,1313,1314],{"name":11,"slug":8,"type":16},{"name":1311,"slug":1312,"type":16},"Deployment","deployment",{"name":22,"slug":23,"type":16},{"name":19,"slug":20,"type":16},"2026-09-02T07:46:51.573641",{"slug":1236,"name":1236,"fn":1317,"description":1318,"org":1319,"tags":1320,"stars":24,"repoUrl":25,"updatedAt":1330},"triage failed SAP automation runs","Triage a failed or suspicious SDAF run: distinguish a real failure from a green no-op or a clean plan reported as failure, map the observed symptom to a documented cause in `docs\u002Flocal\u002Ftroubleshooting.md`, and hand off to the stage-owning skill for retry. Use when a user says \"SDAF run failed\", \"my deploy exited non-zero\", \"the plan was clean but exit 1\", \"the run said success but nothing was deployed\", \"state lock error\", \"unexpected replacement\", \"control plane stopped partway\", \"generated hosts.yaml missing\", \"workload-zone private endpoint failure\", \"workload-zone subnet policy failure\", or \"SDAF exit 2\". Do NOT use to actually deploy or to redesign the workspace layout.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1321,1322,1325,1326,1327],{"name":11,"slug":8,"type":16},{"name":1323,"slug":1324,"type":16},"Diagnostics","diagnostics",{"name":14,"slug":15,"type":16},{"name":19,"slug":20,"type":16},{"name":1328,"slug":1329,"type":16},"Triage","triage","2026-09-02T07:47:40.607437",{"slug":1332,"name":1332,"fn":1333,"description":1334,"org":1335,"tags":1336,"stars":24,"repoUrl":25,"updatedAt":1341},"sdaf-ha-diagnostics","diagnose SDAF high-availability cluster failures","Diagnose a live or recently failed SDAF high-availability cluster without changing cluster state. Start read-first: capture `crm status full` or `pcs status --full`, inspect SBD or fencing evidence, confirm current resource placement, and reuse existing quality-assurance or HCMT artifacts. Grounded in `docs\u002Flocal\u002F07-10-quality-assurance.md`, the shipped Pacemaker role vars\u002Ftasks, and the SAP Automation QA setup role. Use when a user says \"diagnose my HANA failover\", \"crm status\", \"pcs status\", \"check fencing\", \"why is the SCS\u002FERS cluster unhealthy\", \"offline_validation\u002Fcib\", or \"review an HCMT result zip\". Do NOT use for pre-deploy topology or design choices (see `sdaf-ha-topology`), fresh installation\u002Fdeploy, or disruptive failover\u002Ffencing exercises (see `sdaf-quality-assurance`).\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1337,1338,1339,1340],{"name":11,"slug":8,"type":16},{"name":1323,"slug":1324,"type":16},{"name":14,"slug":15,"type":16},{"name":19,"slug":20,"type":16},"2026-09-02T07:48:04.154501",{"slug":1343,"name":1343,"fn":1344,"description":1345,"org":1346,"tags":1347,"stars":24,"repoUrl":25,"updatedAt":1354},"sdaf-ha-topology","design high-availability SAP topologies","Choose the documented SDAF high-availability design before SAP-system deployment. Use when a user asks which HA topology to deploy, whether to use AFA or SBD, AFS or ANF, HANA scale-up or scale-out, whether ANGI is allowed, or which HA inputs must be set before deployment. Ground answers in the current support matrix, Ansible roles, sample tfvars, and validation logic. Do NOT use for live cluster diagnosis (sdaf-ha-diagnostics) or for running the installers (sdaf-sap-installation).\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1348,1351,1352,1353],{"name":1349,"slug":1350,"type":16},"Architecture","architecture",{"name":11,"slug":8,"type":16},{"name":22,"slug":23,"type":16},{"name":19,"slug":20,"type":16},"2026-09-02T07:47:43.405138",{"slug":1356,"name":1356,"fn":1357,"description":1358,"org":1359,"tags":1360,"stars":24,"repoUrl":25,"updatedAt":1364},"sdaf-media-acquisition","acquire SAP installation media","Acquire approved SAP media into the SDAF library after SAP-system infrastructure exists. Drives local `deploy\u002Fansible\u002Fdownload_menu.sh` per `docs\u002Flocal\u002F06-00-software-and-installation.md § Download software`, enforces the documented `BOM_CATALOG` root and the four required `sap-parameters.yaml` BOM keys (`application_bom_name`, `database_bom_name`, `sap_kernel_bom_name`, `save_bom_as`), and explains the documented download and validation flow. Use for \"download SAP media\", \"run download_menu.sh\", \"acquire software into the library\", \"BOM Downloader\", \"BOM_CATALOG\", or \"assemble application\u002Fdatabase\u002Fkernel BOMs for download\". Do NOT use to choose a BOM, troubleshoot a failed download, or run installation playbooks.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1361,1362,1363],{"name":11,"slug":8,"type":16},{"name":14,"slug":15,"type":16},{"name":19,"slug":20,"type":16},"2026-09-02T07:46:44.504107",{"slug":1366,"name":1366,"fn":1367,"description":1368,"org":1369,"tags":1370,"stars":24,"repoUrl":25,"updatedAt":1377},"sdaf-media-diagnostics","diagnose SDAF media and BOM processing","Diagnose SDAF software-download and BOM-processing failures after a BOM is already selected. Covers the documented local media path, SAP download, storage-account upload\u002Fdownload, checksum validation, and `SAPCAR` \u002F `.EXE` extraction. Use when a user says \"download_menu failed\", \"BOM downloader 404\", \"missing archive\", \"checksum mismatch\", \"SAPCAR failed\", \"bom-processing-done missing\", or \"my SPS07 media run can't find a file\". Do NOT use to choose a BOM (see `sdaf-bom-selection`), to run a clean first-time media download with no failure, or to diagnose a later non-media install failure.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1371,1372,1373,1374],{"name":11,"slug":8,"type":16},{"name":1323,"slug":1324,"type":16},{"name":19,"slug":20,"type":16},{"name":1375,"slug":1376,"type":16},"Storage","storage","2026-09-02T07:48:06.369058",18,{"items":1380,"total":1511},[1381,1400,1417,1423,1430,1438,1445,1452,1458,1465,1478,1498],{"slug":1382,"name":1382,"fn":1383,"description":1384,"org":1385,"tags":1386,"stars":1397,"repoUrl":1398,"updatedAt":1399},"azure-arg-external-evaluation-policy-author","author and test Azure Resource Graph policies","Use when the user wants to author, design, or test an Azure Policy that queries Azure Resource Graph (ARG) at request-time — i.e. a policy whose deny\u002Faudit decision depends on data from elsewhere in the subscription (sibling\u002Fparent resource state, RG-wide invariants, multi-hop relationships, etc.). Formally called Azure Policy External Evaluation; sometimes referred to colloquially as \"Invoke\". Drives an iterative KQL co-design loop against the user's real subscription via `az graph query`, then emits a policy definition, assignment, `.http` test flow, and an `EXPLANATION.md` companion. Read-only; never provisions anything.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1387,1388,1391,1394],{"name":11,"slug":8,"type":16},{"name":1389,"slug":1390,"type":16},"Compliance","compliance",{"name":1392,"slug":1393,"type":16},"Governance","governance",{"name":1395,"slug":1396,"type":16},"Policy","policy",1689,"https:\u002F\u002Fgithub.com\u002FAzure\u002Fazure-policy","2026-07-12T08:17:48.378432",{"slug":1401,"name":1401,"fn":1402,"description":1403,"org":1404,"tags":1405,"stars":1414,"repoUrl":1415,"updatedAt":1416},"azure-blueprints-migration","migrate Azure Blueprints to Template Specs","Use when a user needs to migrate off Azure Blueprints (definitions and\u002For assignments) to Template Specs and Deployment Stacks before the January 31, 2027 retirement. Covers inventory, export, conversion to Bicep, policy decoupling, Template Spec publishing, Deployment Stack deployment with deny-settings, validation, and cutover.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1406,1407,1408,1411],{"name":11,"slug":8,"type":16},{"name":1311,"slug":1312,"type":16},{"name":1409,"slug":1410,"type":16},"Infrastructure as Code","infrastructure-as-code",{"name":1412,"slug":1413,"type":16},"Migration","migration",261,"https:\u002F\u002Fgithub.com\u002FAzure\u002Fazure-blueprints","2026-08-20T03:28:18.136156",{"slug":1293,"name":1293,"fn":1294,"description":1295,"org":1418,"tags":1419,"stars":24,"repoUrl":25,"updatedAt":1303},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1420,1421,1422],{"name":11,"slug":8,"type":16},{"name":1300,"slug":1301,"type":16},{"name":19,"slug":20,"type":16},{"slug":1243,"name":1243,"fn":1305,"description":1306,"org":1424,"tags":1425,"stars":24,"repoUrl":25,"updatedAt":1315},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1426,1427,1428,1429],{"name":11,"slug":8,"type":16},{"name":1311,"slug":1312,"type":16},{"name":22,"slug":23,"type":16},{"name":19,"slug":20,"type":16},{"slug":1236,"name":1236,"fn":1317,"description":1318,"org":1431,"tags":1432,"stars":24,"repoUrl":25,"updatedAt":1330},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1433,1434,1435,1436,1437],{"name":11,"slug":8,"type":16},{"name":1323,"slug":1324,"type":16},{"name":14,"slug":15,"type":16},{"name":19,"slug":20,"type":16},{"name":1328,"slug":1329,"type":16},{"slug":1332,"name":1332,"fn":1333,"description":1334,"org":1439,"tags":1440,"stars":24,"repoUrl":25,"updatedAt":1341},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1441,1442,1443,1444],{"name":11,"slug":8,"type":16},{"name":1323,"slug":1324,"type":16},{"name":14,"slug":15,"type":16},{"name":19,"slug":20,"type":16},{"slug":1343,"name":1343,"fn":1344,"description":1345,"org":1446,"tags":1447,"stars":24,"repoUrl":25,"updatedAt":1354},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1448,1449,1450,1451],{"name":1349,"slug":1350,"type":16},{"name":11,"slug":8,"type":16},{"name":22,"slug":23,"type":16},{"name":19,"slug":20,"type":16},{"slug":1356,"name":1356,"fn":1357,"description":1358,"org":1453,"tags":1454,"stars":24,"repoUrl":25,"updatedAt":1364},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1455,1456,1457],{"name":11,"slug":8,"type":16},{"name":14,"slug":15,"type":16},{"name":19,"slug":20,"type":16},{"slug":1366,"name":1366,"fn":1367,"description":1368,"org":1459,"tags":1460,"stars":24,"repoUrl":25,"updatedAt":1377},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1461,1462,1463,1464],{"name":11,"slug":8,"type":16},{"name":1323,"slug":1324,"type":16},{"name":19,"slug":20,"type":16},{"name":1375,"slug":1376,"type":16},{"slug":1466,"name":1466,"fn":1467,"description":1468,"org":1469,"tags":1470,"stars":24,"repoUrl":25,"updatedAt":1477},"sdaf-orientation-and-surface","orient users to SDAF architecture","Orient a newcomer to the SAP Deployment Automation Framework (SDAF): explain the spine (control plane → workload zone → SAP system → software → install → operate\u002Fremove), summarise the three execution surfaces (Local, Azure DevOps, GitHub Actions), and print the install command for the matching surface bootstrap plugin — as documented in this repository's `docs\u002FPLUGINS.md` — so the operator can run it manually. Use when a user says \"what is SDAF\", \"how is SDAF structured\", \"where do I start with SDAF\", \"which surface should I use\", \"SDAF Local vs ADO vs GitHub\", \"workstation vs Azure Pipelines vs GitHub workflows\", \"how do I install the SDAF ADO\u002FGitHub plugin\", or \"I'm new to SDAF\". Do NOT use for readiness pre-flight (see sdaf-readiness-check), workspace\u002Ftfvars layout (see sdaf-workspace-and-tfvars), or troubleshooting a failed run (see sdaf-failure-triage).\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1471,1472,1473,1476],{"name":1349,"slug":1350,"type":16},{"name":11,"slug":8,"type":16},{"name":1474,"slug":1475,"type":16},"Documentation","documentation",{"name":19,"slug":20,"type":16},"2026-09-02T07:46:52.116557",{"slug":1479,"name":1479,"fn":1480,"description":1481,"org":1482,"tags":1483,"stars":24,"repoUrl":25,"updatedAt":1497},"sdaf-plan-and-test-semantics","manage SDAF plan and test semantics","Explain SDAF plan-only \u002F test \u002F apply semantics without pretending they are universal. Compares the documented Local commands, Azure DevOps wrapper pipelines, and GitHub Actions workflows for control plane, workload zone, and SAP system: local stage commands show Terraform plans and then apply after approval; ADO\u002FGitHub workload-zone and SAP-system test runs stop after the plan; the current hosted control-plane test options do not provide a plan-only run. Use when a user says \"what does test do in SDAF\", \"is this a real dry run\", \"plan-only vs apply\", \"workflow 01 dry-run\", \"pipeline 02 test\", or \"TEST_ONLY\". Do NOT use to actually deploy a stage or to triage a failed run (see sdaf-control-plane-bootstrap \u002F sdaf-workload-zone \u002F sdaf-sap-system \u002F sdaf-failure-triage).\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1484,1487,1488,1491,1494],{"name":1485,"slug":1486,"type":16},"Automation","automation",{"name":11,"slug":8,"type":16},{"name":1489,"slug":1490,"type":16},"Azure DevOps","azure-devops",{"name":1492,"slug":1493,"type":16},"CI\u002FCD","ci-cd",{"name":1495,"slug":1496,"type":16},"GitHub Actions","github-actions","2026-09-02T07:48:08.951811",{"slug":1499,"name":1499,"fn":1500,"description":1501,"org":1502,"tags":1503,"stars":24,"repoUrl":25,"updatedAt":1510},"sdaf-quality-assurance","validate deployed SDAF SAP systems","Validate a deployed SDAF SAP system through the SDAF-owned QA entry points: the local quality-assurance menu and the documented Azure DevOps pipeline 13 path. Choose configuration checks vs functional tests, apply `TEST_GROUPS` \u002F `TEST_CASES` safely, interpret `quality_assurance\u002F` and `logs\u002F`, and enforce the documented boundary that the GitHub Actions wrapper is still pending. Use when a user says \"run quality assurance\", \"run configuration checks\", \"pipeline 13 QA\", \"offline HA validation\", or \"why does the report say No test results found\". Do NOT use to deploy the SAP system or generate `sap-parameters.yaml` \u002F `\u003CSID>_hosts.yaml` (see `sdaf-sap-system`), or for a generic failed-run report with no QA-stage context (see `sdaf-failure-triage`).\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1504,1505,1506,1509],{"name":1485,"slug":1486,"type":16},{"name":11,"slug":8,"type":16},{"name":1507,"slug":1508,"type":16},"Quality Assurance","quality-assurance",{"name":19,"slug":20,"type":16},"2026-09-02T07:46:49.932123",145]