Phase 1: Extract Insights
The goal of this phase is to extract insights from the user's existing Azure environment. These insights will be used to guide the planning process in later phases.
- Check whether insights already exist at
<project-root>/.azure/insights.json. If they do, reuse the existing entries and skip the scan in steps 2–6. In referenced mode, still execute step 7 before completing the gate; in greenfield mode, proceed to the gate. - If no insights file exists, check whether the
insights_gettool is available. If it is not, initialize the file with[], then continue to step 7 in referenced mode or proceed to the gate in greenfield mode. - Ask the user which scope to use for generating insights. Present these three options: a. "Subscription-scoped (default subscription)" — use this as the default if the user does not respond. b. "Subscription-scoped (choose a subscription)" — if selected, ask the user to provide a subscription name or ID. c. "Tenant-scoped (slower)"
- Ask the user whether there are specific areas they want the insights to focus on. Present these options: a. "General" — use this as the default if the user does not respond. b. "Cost" c. "Reliability" d. "Security" e. "Performance" f. "Other" — this should be a custom input field.
- Run the
insights_gettool using a general-purpose subagent. Pass a one-line summary via the--queryoption that describes the user's infrastructure and the types of insights to prioritise. Do not pass the--nocacheflag unless the user has explicitly asked for it. Begin Phase 2 while this tool runs. - Once the tool finishes, save the resulting JSON to
<project-root>/.azure/insights.json. Do not include tool call metadata. If the tool errors or returns no insights, write an empty array[]to the file instead. - In referenced mode, merge one insight entry for every existing resource into the current insights array. Set
existingResource.id,type,name,role,must_not_recreate: true, andintegrationPointsusing the normalized inventory. Preserve full ARM IDs for actual-state resources and do not duplicate an entry already identified by the same resource ID. Do this even when the resource produces no broader insight.
Gate
insights.jsonmust exist and match the Insights Schema defined in schema.md. If the tool errored or returned no insights, the file should contain an empty array[].- In referenced mode, every inventoried existing resource has an
existingResourceentry withmust_not_recreate: true; actual-state entries preserve their full ARM IDs.