Skip to content

Design note: refresh the rad init experience - #12684

Open
zachcasper wants to merge 6 commits into
radius-project:mainfrom
zachcasper:rad-init-fixes
Open

Design note: refresh the rad init experience#12684
zachcasper wants to merge 6 commits into
radius-project:mainfrom
zachcasper:rad-init-fixes

Conversation

@zachcasper

@zachcasper zachcasper commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

Summary

Adds a design note proposing a refresh of the preview rad init --preview experience: make the default command zero-question and always produce a working setup, and extend the interactive --full flow. Docs-only; no code changes.

The note specifies six changes, scoped to the preview (Radius.*) init path only (the stable Applications.* path is unchanged):

  1. Always write bicepconfig.json; never write app.bicep (No bicepconfig.json created after rad init #12588, rad init creates an unnecessary stub application resource #12649, Sample app.bicep scaffolded by rad init should define an application resource rather than an application parameter #12418)
  2. Register only the radius Bicep extension (Malformed error message when Kubernetes namespace does not exist during rad init #12414)
  3. Remove the application-scaffold prompt and options (Confusing user prompt on rad init #12587)
  4. Reorder --full so cloud-provider setup precedes the environment prompts
  5. Add a recipe-pack selection step sourced from defaults.yaml (depends on resource-types-contrib#296)
  6. Human-readable initialization errors (Remove AWS Bicep extension from bicepconfig.json scaffolded by rad init #12568)

It also records the CI-impact analysis (existing CI provisions Radius with rad install kubernetes, not rad init, so it is unaffected) and a getting-started tutorial smoke-test plan to guard the on-ramp now that the local app.bicep scaffold is removed.

Reason for change

rad init is the product's on-ramp, and small regressions have compounded into a rough first run: a vague scaffold prompt, a missing bicepconfig.json when declined, an unnecessary stub application resource, an unwanted aws Bicep extension, and initialization errors that corrupt the terminal. This note captures the design before implementation.

Design proposal for #12588, #12649, #12587, #12418, #12414, and #12568. Implementation PRs will close these; this design note does not.

How to test

Docs-only. Review eng/design-notes/cli/2026-08-rad-init-refresh.md and run the Markdown linters:

npx markdownlint-cli2 --config .github/linters/.markdownlint-cli2.yaml eng/design-notes/cli/2026-08-rad-init-refresh.md

Signed-off-by: Zach Casper <zachcasper@microsoft.com>
@radius-functional-tests

radius-functional-tests Bot commented Aug 14, 2026

Copy link
Copy Markdown

Radius functional test overview

🔍 Go to test action run

Click here to see the test run details
Name Value
Repository zachcasper/radius
Commit ref cbedb22
Unique ID func6cb4da3da7
Image tag pr-func6cb4da3da7
  • Dapr: 1.14.4
  • Azure KeyVault CSI driver: 1.4.2
  • Azure Workload identity webhook: 1.3.0
  • Bicep recipe location ghcr.io/radius-project/dev/test/testrecipes/test-bicep-recipes/<name>:pr-func6cb4da3da7
  • Terraform recipe location http://tf-module-server.radius-test-tf-module-server.svc.cluster.local/<name>.zip (in cluster)
  • applications-rp test image location: ghcr.io/radius-project/dev/applications-rp:pr-func6cb4da3da7
  • dynamic-rp test image location: ghcr.io/radius-project/dev/dynamic-rp:pr-func6cb4da3da7
  • controller test image location: ghcr.io/radius-project/dev/controller:pr-func6cb4da3da7
  • ucp test image location: ghcr.io/radius-project/dev/ucpd:pr-func6cb4da3da7
  • deployment-engine test image location: ghcr.io/radius-project/deployment-engine:latest

Test Status

⌛ Building Radius and pushing container images for functional tests...
✅ Container images build succeeded
⌛ Publishing Bicep Recipes for functional tests...
✅ Recipe publishing succeeded
⌛ Starting corerp-cloud functional tests...
⌛ Starting ucp-cloud functional tests...
✅ ucp-cloud functional tests succeeded
❌ corerp-cloud functional test failed. Please check the logs for more details

@github-actions

Copy link
Copy Markdown

Functional Tests - corerp-cloud

30 tests  ±0   27 ✅  - 2   20m 25s ⏱️ - 3m 40s
 2 suites ±0    1 💤 ±0 
 1 files   ±0    2 ❌ +2 

For more details on these failures, see this check.

Results for commit cbedb22. ± Comparison against base commit aeb5292.

Signed-off-by: Zach Casper <zachcasper@microsoft.com>
Comment thread eng/design-notes/cli/2026-08-rad-init-modernization.md Outdated
Comment thread eng/design-notes/cli/2026-08-rad-init-modernization.md Outdated
Comment thread eng/design-notes/cli/2026-08-rad-init-modernization.md Outdated
Comment thread eng/design-notes/cli/2026-08-rad-init-modernization.md Outdated
Signed-off-by: Zach Casper <zachcasper@microsoft.com>
@zachcasper zachcasper changed the title Design note: updated rad init experience Design note: refresh the rad init experience Aug 19, 2026
@zachcasper
zachcasper marked this pull request as ready for review August 19, 2026 15:59
@zachcasper
zachcasper requested a review from a team as a code owner August 19, 2026 15:59
Copilot AI lite review requested due to automatic review settings August 19, 2026 15:59
@zachcasper
zachcasper requested a review from a team as a code owner August 19, 2026 15:59
@zachcasper
zachcasper enabled auto-merge August 19, 2026 15:59

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Warning

Copilot couldn't run its full agentic review because it didn't start before the timeout. Make sure your repository has a runner available, or add a copilot-code-review.yml file specifying one with the runs-on attribute. See the docs for more details.

Adds a design note describing a proposed refresh of the preview rad init --preview experience, focusing on making the default flow zero-question and improving the --full interactive flow.

Changes:

  • Introduces goals/scope and an as-is vs to-be UX walkthrough for rad init --preview and --full
  • Specifies six detailed design changes (bicepconfig behavior, extensions, prompt removal/reorder, recipe pack selection, improved error rendering)
  • Adds a test plan and CI impact analysis for the proposed changes

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread eng/design-notes/cli/2026-08-rad-init-refresh.md
Comment thread eng/design-notes/cli/2026-08-rad-init-refresh.md Outdated
Comment thread eng/design-notes/cli/2026-08-rad-init-refresh.md
Comment thread eng/design-notes/cli/2026-08-rad-init-refresh.md
Comment thread eng/design-notes/cli/2026-08-rad-init-refresh.md Outdated
Copilot stopped reviewing on behalf of zachcasper due to an error August 19, 2026 16:21
…nd error-message wording

Signed-off-by: Zach Casper <zachcasper@microsoft.com>
- Kubernetes namespace: prod
- Recipe pack: azure-aks
✅ Update local configuration
- /home/user/my-project/bicepconfig.json

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wonder if we could remove the dependency for bicepconfig.json on the filesystem. what if we could point to it like github.com/radius-project/radius/bicepconfig.json@main

```json
{
"extensions": {
"radius": "br:biceptypes.azurecr.io/radius:latest"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

will soon be something like

br:ghcr.io/radius-project/radius/types:latest

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@brooke-hamilton brooke-hamilton left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a great doc.

**Sample Input:**

```bash
rad init --preview

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this be rad init --full?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No, this is the default path with no --full. The --full output is the next section.

Comment thread eng/design-notes/cli/2026-08-rad-init-refresh.md

### Goals

- Make the default `rad init` a zero-question command that always produces a working Radius installation and a valid `bicepconfig.json`.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is really great because we currently cannot use rad init in a script because it has interactive questions.

- Stop producing artifacts the getting-started flow no longer needs: the sample `app.bicep` file and the stub application resource.
- Only register the `radius` Bicep extension in the generated `bicepconfig.json`, dropping the `aws` extension.
- Render initialization errors (especially the missing-namespace error) as concise, human-readable messages that do not corrupt the terminal.
- Keep `rad init --full` as the interactive path for platform engineers, and add a recipe-pack selection step sourced from `defaults.yaml` / `resource-types-contrib`.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In addition to the --full option, which is purely interactive, could we add arguments for each option asked by the --full workflow so that we could use rad init in a script and specify all available options exposed by rad init --full?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That could get very long. We may consider a values file instead. rad init -f my-values.yaml.

- [#12587: Confusing user prompt on `rad init`](https://github.com/radius-project/radius/issues/12587)
- [#12418: Sample `app.bicep` should define an application resource rather than an `application` parameter](https://github.com/radius-project/radius/issues/12418)
- [#12568: Malformed error message when Kubernetes namespace does not exist during `rad init`](https://github.com/radius-project/radius/issues/12568)
- [#12414: Remove AWS Bicep extension from `bicepconfig.json` scaffolded by `rad init`](https://github.com/radius-project/radius/issues/12414)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This links to an unrelated issue - can you share the correct link?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is the underlying issue for Change 6: Human-readable initialization errors (fix #12568).

Comment thread eng/design-notes/cli/2026-08-rad-init-refresh.md

This change closes a usability gap in `--full`: there is no way to choose a recipe pack, so every environment is created with the hardcoded default pack.

In default mode the environment is created with the `kubernetes` pack (unchanged behavior); it is the default pack, and its `recipePacks` resource is named `default` in the contrib file (hence the `Recipe pack: default` line in the output). In `--full` mode, present a list built from the `recipePacks` entries in [`defaults.yaml`](../../../deploy/manifest/defaults.yaml) (today: `azure`, `kubernetes`, after [PR #12662](https://github.com/radius-project/radius/pull/12662): `azure-aci`, `azure-aks`, `kubernetes`).

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If someone picks azure-aks but answered "no" to the cloud provider prompt, what happens? Now that cloud provider setup comes first, we could filter the pack list or warn. Can we say what the intended behavior is?

```text
cluster (kube context)
→ cloud providers (moved earlier)
→ environment name

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the provider would be updated in an environment, so wouldnt the earlier ordering make sense?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants