Skip to content

docs: prepare metadata-based module maintenance - #2936

Draft
Jared Holgate (jaredfholgate) wants to merge 16 commits into
mainfrom
jaredfholgate-metadata-maintenance-docs
Draft

Jared Holgate (jaredfholgate) wants to merge 16 commits into
mainfrom
jaredfholgate-metadata-maintenance-docs

Conversation

@jaredfholgate

@jaredfholgate Jared Holgate (jaredfholgate) commented Sep 16, 2026

Copy link
Copy Markdown
Member

Overview/Summary

Document module details and ownership changes through reviewed metadata.json updates. Keep this change in draft; all six rollout gates below remain unchecked. The owner pages describe the intended approved workflow in the present tense; this is not evidence of production adoption. Maintainer rollout and security prerequisites stay here and in the existing operator references.

This PR fixes/adds/changes/removes

  1. Explains which root or child metadata file to edit, supported fields, and normal validation and review. Root owners is a flat array containing every approved owner; children inherit it. Either eligible metadata code-owner team can approve. Metadata does not grant access or review rights.
  2. Covers ownership changes, transfers, orphaning ("owners": []), and adoption while retaining eligibility, written consent, handover, access approval, tracking issues, and required notices. Metadata-only changes do not trigger module releases.
  3. Preserves real resource types, approved pattern/utility taxonomy, Bicep paths and source-literal consistency, assigned telemetry, proposal approval, MAR approval, and language-specific retirement steps. The child-only helper contract retains JSON records and omits CSV rows; compatible helper tooling remains gated below.
  4. Keeps generated public module indexes and CSV downloads as valid lookup references. Metadata corrections go to the source repository; catalog generation and reviewed publication update outputs separately.
  5. Simplifies the existing owner guidance across contribution pages, FAQs, specifications, triage instructions, and reusable messages. Removes obsolete inventory/registration references and migration, backfill, preview, and bootstrap implementation narratives. Repository setup keeps the current planning example and links the repository-creation README for operator prerequisites, options, and recovery.

Latest cleanup

Pushed commit: 9dc260f14c5efe1911c3b54f6354adda4101d50a (docs: simplify module owner metadata guidance).

The cleanup changes 28 Markdown files already in this review: 91 insertions and 196 deletions. The metadata guide is about 60% shorter (2,801 to 1,119 words). No generated index data, workflow, module source, permission, or tools checkout changed. Existing full-sync backfill and automatic inference remain supported; omitting their operator details from owner pages does not remove or redefine those facilities.

Breaking Changes

  1. Documentation only. No schema, tooling behavior, production setting, or authorization changes.
  2. Normal metadata code-owner review, separate access approval, and source-change validation/release requirements remain.
  3. Helper support, per-target adoption, and canonical catalog publication remain subject to the unchecked gates below.

Verified implementation dependencies

  • Azure/azure-verified-modules-tools#138 merged at 2026-09-18T12:06:14Z, merge commit 9004c3b577626b717520e3130a7d827d4a7f043b. All 17 checks succeeded on reviewed head 56986ed6dd86c6d73fd8532b2c725729276944a9, including the full CI run. Current creation, metadata/backfill, and catalog references were inspected as text. The merge and CI are not proof of release, installation, initial-push policy approval, or production adoption.
  • Azure/azure-verified-modules-tools#134 remains OPEN and unmerged at a565bdd633d345c572c31b130e0915430fe1332b, with previously verified successful exact-head checks. The child-only helper contract still needs normal approval and compatible release/adoption; it is not supported by the previously verified Oracle-compatible v0.15.1 release.
  • Normal repository validation requires a compatible, separately approved installed/released schema. Source or worker compatibility does not establish consumer installation or rollout readiness. No fetched code or examples were executed.

Rollout gates - do not merge yet

  • Obtain successful exact-head hosted-CI results and normal approvals for Azure/azure-verified-modules-tools#134 at a565bdd633d345c572c31b130e0915430fe1332b. The child-only marker, strict child fields, inherited owners, optional validated telemetry, JSON identity/null ARM fields, CSV omission, and source-removal guards were verified in source, and exact-head hosted checks have passed; approval, release, and adoption remain separate. Recheck the contract if the head changes. Do not treat v0.15.1 as helper-compatible or invent a release version. The repository-discovery/creation implementation in Azure/azure-verified-modules-tools#138 is merged with successful exact-head checks; its release, installation, policy approval, and adoption are still separate requirements.
  • Confirm compatible tooling, metadata files, human review protection, and release guards are adopted for each affected target. Apply the helper addition only to reviewed helper submodules; preserve existing valid metadata/source and separate excluded roots. Verify stable collision-checked telemetry identifiers where required. Non-helper migration progress does not prove helper readiness or universal installation; ordinary validation still requires a compatible separately approved installed/released schema. No full settings/Azure sync is authorized for the one-off exercise. Verify adoption of default-branch root-metadata discovery and the new first-commit creation flow separately; the draft does not establish either.
  • Authorized administrators verify both metadata code-owner teams' visible write access and the App installation/authorization for the particular target. Either eligible team can satisfy normal human review. The user's specific existing-App bypass authorization for this migration is not normal review/test success, a general contributor exemption, or permission to change protections/statuses. Keep per-target access/operation checks; this documentation session grants no new access or authority. New repository creation also requires create/push/custom-property rights and the narrowly scoped, verified restoration/recovery procedure; it is not an established-repository or global bypass. Obtain maintainer/SFI sign-off and an approved canary for the initial-push exception before production use; this review does not supply that approval.
  • Resolve proposals without repository/source files. Preserve proposal approval, #RFRC, and issue tracking; keep excluded roots, archived review-only repositories, and missing/proposed/private targets separate. Catalog rows require valid metadata. Missing source CSV rows, including helper CSV omissions where a source row existed, block default publication unless explicitly authorized under the existing removal-only override. No invented metadata home, synthetic ARM type, full legacy fallback, or discarded proposal issue.
  • Catalog publication and the separate canonical CSV changeover are ready. Verify helpers remain in JSON only, with stable identity and inherited ownership, and do not appear in CSV outputs. Source CSVs alone remain the removal baseline for preview/future overwrite destinations; JSON retention does not bypass this guard. Catalog updates stay reviewed and separate from target metadata publication. Keep test-*.csv previews separate from canonical CSVs and retain v1/modules.json until reviewed cutover. Generation and publication each require their own explicit removal-only force authorization; neither bypasses invalid metadata or other safeguards. The current catalog operator reference retains these procedures.
  • Align public documentation adoption with rollout and update the internal Azure-Verified-Modules-Docs runbook. Record reviewed helper selection, compatible installed schema, JSON-versus-CSV behavior, and source-row removal review. Keep the scoped App authorization/audit trail distinct from normal human reviews, full-sync authorization, and catalog publication overrides. Include default-branch discovery, removal of the internal inventory fallback, and new-repository-only custom-property restoration, retained recovery data, and interruption handling. Add to an existing open documentation change where possible. BAMI activation remains independent.

Validation

  • Passed locally on the cleanup: Markdownlint 0.41.0 with repository rules on all 28 changed files; Hugo Extended 0.136.5 with --gc --minify --ignoreCache (934 pages, 394 static files); whitespace/LF and documentation-only scope checks.
  • Links and examples: 55 added internal links/anchors across the complete review, including 5 from this cleanup; all 13 references to metadata-guide anchors across the docs resolve. All 5 added external links return HTTP 200 using the existing Markdown link checker and repository configuration. All three repository-creation PowerShell examples parse without execution.
  • Preserved behavior: root ownership and child inheritance, either-team review, access separation, metadata-only release guard, helper semantics, Bicep literal/path rules, telemetry assignment, proposal/MAR approval, and retirement requirements checked in source and rendered pages. Public index data and download pages are untouched.
  • Hosted snapshot after push: CLA passed; five checks were running across Hugo, lint/link checks, and CodeQL. No terminal result is claimed for 9dc260f14c5efe1911c3b54f6354adda4101d50a; no polling loop or workflow dispatch was started.

No production repository creation, fleet sync, custom-property write, credential access, site publication, release, or merge was performed by this documentation session.

As part of this Pull Request I have

  • Read the Contribution Guide and ensured this PR is compliant with the guide
  • Checked for duplicate Pull Requests
  • Associated it with relevant GitHub Issues or ADO Work Items (Internal Only)
  • Ensured my code/branch is up-to-date with the latest changes in the main branch
  • Ensured PR tests are passing
  • Updated relevant and associated documentation (e.g. Contribution Guide, Docs etc.)

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Jared Holgate (jaredfholgate) added a commit to Azure/bicep-registry-modules that referenced this pull request Sep 16, 2026
## Description

Add initial module-owned metadata directly to this repository, allow
metadata review by either engineering owners or module owners, and keep
metadata-only changes out of automatic publishing workflows.

- Add **572 `metadata.json` files: 222 roots and 350 children**. All 573
`main.bicep` directories were inventoried; the unpublished internal
`avm/ptn/ai-ml/ai-foundry/modules/project` helper is excluded.
- Root `owners` is a **flat string array**. Preserve all **281 username
entries**, their order/casing, and every MEMBER/MAINTAINER handle
incorporated from the supplied 2026-09-10 snapshot and official indexes.
Thirteen roots have more than two owners; nine genuinely missing owner
lists remain `owners: []`. No deleted legacy team or replacement owner
is invented.
- Authored metadata contains **no `schemaVersion` or `tier`**. The
versioned `$schema` URL remains unchanged. Children do not author
owners. Bicep deprecation is derived from existing `DEPRECATED.md`; no
lifecycle field or deprecation/source edit is introduced here.
- End `.github/CODEOWNERS` with exactly `metadata.json
@Azure/azure-verified-modules-engineering-owners
@Azure/azure-verified-modules-module-owners`, after every module/tooling
rule. **Approval from either team qualifies; approval from both is not
required.** Other ownership remains unchanged.
- Append `!avm/**/metadata.json` to all **217** current per-module
resource, pattern, and utility publishing workflows. Generic
validation/tag-preview remains eligible for metadata changes. Manual
release/approval controls and both existing `main.json`/`version.json`
release selectors remain unchanged.
- Cover root/nested/unindexed ownership, final precedence,
metadata-only/mixed/source/version changes, child release selection, and
explicit manual releases with offline regressions.

### Approved metadata reviewer policy

Commit **2fe528df6fe20f849fb79055589677098357680c** implements the
user-approved two-team OR policy. It changes only `.github/CODEOWNERS`,
the module governance assertion, and the focused ownership tests. The
final basename rule covers root, child, deep, utility, pattern,
resource, and unindexed metadata paths. Tests reject missing approved
teams, an unapproved third team/person, narrowed coverage, and shadowing
rules.

All **572 metadata files**, source/deprecation files, workflow filters,
release selectors, and manual controls are unchanged from the approved
shape below. No GitHub access or review settings are changed.

### Approved authored-shape update

Commit **7f3502d7fb3cb9aa4e6e37911b494205b9619230** changes only the 572
metadata files: remove `schemaVersion`, remove root `tier`, and replace
root owner objects with ordered string arrays. Any nonempty qualified
team would be retained as an array entry; this backfill had none.

Compared with baseline `7fe0438eff8b2b9f4595ec39254c2e2a3213e6e7`,
native JSON checks verify that **every unaffected raw field value is
identical**, including `$schema`, names, descriptions, canonical types,
telemetry, aliases, and comments. All owner strings and their order are
preserved. Nine empty owner arrays and fourteen approved
unpublished-child telemetry omissions are retained. All 572 files pass
the ready shared schema and current source-literal validation.

No source, compiled template, version, workflow, governance,
deprecation, or test file changed in this shape-update commit. Its
actual staged and committed diffs both select **zero module release
templates**.

### Main integration and readiness

Merged `origin/main` **dfa9bab2c46e97b018b0d7b987537f738f6c0ef5** into
this published branch without rebasing or force-pushing, in merge commit
**7fe0438eff8b2b9f4595ec39254c2e2a3213e6e7**.

That merge includes
[#7351](#7351), BAMI
canary validation-variable selection, and
[#7348](#7348), the
PostgreSQL configuration update. BAMI changes validation
tenant/subscription bindings, not workflow inventory or release
selection. Its selected-BAMI checks, legacy behavior for unselected
modules, and credential isolation remain unchanged.

A subsequent read-only compatibility check of main through
**f1f4ba28698437d9a683d68bf181341ad3547e48** found two newer commits
affecting 18 root modules. Their names, descriptions, telemetry
identifiers, canonical types, and all release/governance assumptions
remain compatible with this metadata. Those newer main commits were
**not merged** during the metadata-shape or reviewer-policy updates. Any
required final integration/revalidation remains an explicit rollout
gate; checks on this branch do not claim to cover an unmerged combined
tree.

The review's module changes remain metadata additions only. No extra
`main.bicep`, `main.json`, `version.json`, module README, changelog,
runtime backfill workflow, approval files, reviewed flags, live settings
changes, workflow dispatches, or remote merges are introduced.

### Telemetry and existing data

Fourteen uninstrumented, unpublished resource children intentionally
omit `telemetryIdPrefix`. Each lacks a version file,
publishing-allowlist entry, index entry, and telemetry resource.
[BCPFR4](https://azure.github.io/Azure-Verified-Modules/spec/BCPFR4)
requires top-level telemetry but exempts nested children unless enabled
for direct publishing. Their parents emit telemetry;
[BCPFR7](https://azure.github.io/Azure-Verified-Modules/spec/BCPFR7)
also requires resource parents to disable telemetry on referenced
published modules. Redis child publishing was explicitly rolled back for
upcoming service deprecation in
[#7096](#7096).

The backfill preserves these **pre-existing issues for separate
source/release follow-up**:

- Budget `rg-scope` and `sub-scope` currently emit
`46d3xbcp.res.consumption-budget_mgscope`. Metadata records the actual
source value, not the differing CSV values.
- Resource Graph query currently emits `46d3xbcp.resourcegraph-query`,
without `.res.`. Metadata preserves this exact, narrowly supported
legacy identifier.
- The existing compiled
`avm/ptn/sa/conversation-knowledge-mining/main.json` lacks metadata
name/description fields. Its new metadata matches current Bicep
literals; compiled output is left untouched by this change.

Metadata-only edits, including `telemetryIdPrefix`, do not publish.
Publishing an output-affecting metadata change still requires a normal
source change with generated `main.json`, or a `version.json` release
change.

### Enforcement and coordinated rollout

Active default-branch ruleset **23285568 still has
`require_code_owner_review=true` and one required approving review**,
with no separate required-reviewer list. Both approved teams are visible
and have existing write access. GitHub treats multiple owners on the
same CODEOWNERS line as alternatives, so either team's approval
satisfies this metadata ownership requirement, not both. Existing
authorized AVM App bypass settings are untouched; actor details were not
exposed by the read credential and remain an operator-verification
prerequisite. CODEOWNERS enforcement uses the adopted base-branch rule.
Previously reported unrelated owner-access warnings are not changed by
this policy update.

Follow the [coordinated rollout
plan](https://github.com/Azure/azure-verified-modules-tools/blob/jaredfholgate-module-metadata-implementation/docs/metadata-rollout.md):
operator-approved Bicep Sync pause before the metadata tools merge, and
resume only after repository and generated governance agree on the exact
two-team rule and the operator approves scheduled applies.

- **Sole active tools dependency:**
[Azure/azure-verified-modules-tools#113](Azure/azure-verified-modules-tools#113)
at **db2cf27af7befc4bf1e8dc271f2da084489c62df** consolidates the shared
schema, authoring, catalog, and generated CODEOWNERS policy. Its exact
final two-team rule matches this registry head
`2fe528df6fe20f849fb79055589677098357680c`. The updated v1 schema must
be available before consumers validate the flat authored shape against
its public URL.
- **Final tools CI confirmed on that exact head:** [CI run
35123274927](https://github.com/Azure/azure-verified-modules-tools/actions/runs/35123274927)
passed all **11 jobs**, including three operating-system builds and six
integration legs. [Configuration
validation](https://github.com/Azure/azure-verified-modules-tools/actions/runs/35123274975)
passed both jobs, and
[CodeQL](https://github.com/Azure/azure-verified-modules-tools/actions/runs/35123270783)
passed. All **17 reported current-head checks are successful**. The
tools review remains OPEN/MERGEABLE, but GitHub reports BLOCKED for an
unverified policy reason; successful CI does not establish that every
merge or rollout gate is satisfied.
- Historical policy work
[Azure/azure-verified-modules-tools#120](Azure/azure-verified-modules-tools#120)
is **CLOSED as superseded, not merged**, after its full history was
consolidated into the tools implementation. Its branch is retained and
it is no longer a separate merge dependency. The generator repair
[Azure/azure-verified-modules-tools#119](Azure/azure-verified-modules-tools#119)
is merged.
- Public workflow template/contribution guidance:
[Azure/Azure-Verified-Modules#2929](Azure/Azure-Verified-Modules#2929)
is merged. Public process documentation remains a separate draft in
[Azure/Azure-Verified-Modules#2936](Azure/Azure-Verified-Modules#2936)
at `5ff656df746a0a3e1c213438cc56621959f55cec`.

## Pipeline Reference

<!-- Insert your Pipeline Status Badge below -->

| Validation | Result |
| --- | --- |
| Current reviewer policy: ownership and release regression suites |
**355 passed**, zero failures/skips; covers either approved team,
unindexed/deep metadata and unapproved third owners |
| Current reviewer policy: change boundary | Exactly three governance
files; all 572 metadata files and release controls unchanged |
| Current reviewer policy: committed release diff | **Zero publishable
templates** selected |
| Authored shape: ready schema and source literals | **572 passed**;
schema SHA256
`BE3945F44CABE20C6DD078911D762B18CB684C29E59D8CA830666C06A45AE087` |
| Authored shape: unaffected raw values and owner order | All 572 files
match the original values; all 281 usernames preserved |
| Authored shape: actual staged/committed diff, Prettier and whitespace
| Zero release templates; all 572 formatting checks passed |
| Prior main integration: combined BAMI/CI-parameter and metadata
regressions | 387 passed at `7fe0438` |
| Prior main integration: Actionlint 1.7.12 | 221 publishing
workflows/templates passed; three unsupported `queue` diagnostics in
unchanged `avm.module.yml` reproduce on main |
| Prior upstream PostgreSQL source/test compilation | Both compiled
without rewriting files; two existing API/module-age warnings |

The original three per-module YAML formatting warnings in
api-center.service, azd.apim-api, and sa.content-generation remain
unchanged. No concurrency or release control was weakened to silence an
older linter. Fresh automatic checks are evaluated on exact
reviewer-policy head `2fe528df6fe20f849fb79055589677098357680c`; no
Azure deployment/release workflow was dispatched.

## Type of Change

<!-- Use the checkboxes [x] on the options that are relevant. -->

- Azure Verified Module updates:
- [ ] Bugfix containing backwards-compatible bug fixes, and I have NOT
bumped the MAJOR or MINOR version in `version.json`:
- [ ] Feature update backwards compatible feature updates, and I have
bumped the MINOR version in `version.json`.
- [ ] Breaking changes and I have bumped the MAJOR version in
`version.json`.
  - [ ] Update to documentation
- [x] Update to CI Environment or utilities (Non-module affecting
changes)

## Checklist

- [x] I'm sure there are no other open Pull Requests for the same
update/change
- [ ] I have run `Set-AVMModule` locally to generate the supporting
module files.
- [ ] My corresponding pipelines / checks run clean and green without
any errors or warnings
- [ ] I have updated the module's CHANGELOG.md file with an entry for
the next version

`Set-AVMModule`, module changelogs, and Azure deployment validation are
intentionally not applicable to the metadata-only module diff. Offline
results and pre-existing tool/compiler warnings are recorded above.

<!-- Please keep up to date with the contribution guide at
https://aka.ms/avm/contribute/bicep -->

---------

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Document that avm metadata initialize (Avm.Authoring) must be used to
scaffold a valid metadata.json for every new Bicep/Terraform root module
and child module/submodule, with root modules getting full owner
metadata and children getting the reduced inherited-owner shape.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant