azclips
AGENTS.md15 starsChanged 2 days agoMITView on GitHub
Scoped guidance for the Azure DevOps (ADO) CI/CD pipelines under .azure-pipelines/. Read this before editing any pipeline YAML. Packaging/build logic invoked by the pipelines lives in devops/scripts/; keep the two in sync. When you add or change a stage, job, pipeline, trigger, variable/group, secret source, or artifact, update this guide in the same PR so it stays accurate.
- Commits and pushes
Where files are headingNew AGENTS.md files have more rules about keeping secrets out of the code, and fewer about code style.
Of the AGENTS.md files we read, the 31,439 first seen in the last six months, against the older ones: the kind of rule that gained most share, and the kind that lost most. About files like this in general, not this one, and an estimate, since a kind is a pattern in the words.
In this repository13 other files it gives its agents.
- Agent/AGENTS.mdAGENTS.md
- AGENTS.mdAGENTS.md
- devops/scripts/AGENTS.mdAGENTS.md
- azclips-custom-code-classifierSkill
- azclips-scenario-test-converterSkill
- extension-test-coverageSkill
- migrate-clips-to-extensions-codegen-llm-hybridSkill
- openspec-apply-changeSkill
- openspec-archive-changeSkill
- openspec-exploreSkill
- openspec-proposeSkill
- openspec-sync-specsSkill
- openspec-verify-changeSkill
The file
We split this AGENTS.md into the rules it gives an agent
9 rules. About 1 is common, 3 are distinctive, and 5 are very specific to this project.
≈1
Common · estimate
Many files like this have a rule of this kind.
≈3
Distinctive · estimate
This author's own choices. Worth a look.
5
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 4
Read this before editing any pipeline YAML.
- Very specific: line 12
Never inline secrets. Credentials come from variable groups, Azure Key Vault, approved Azure service connections (e.g.
- Distinctive: line 14
Keep changes template-driven: prefer editing a shared template over duplicating steps in an entry pipeline.
- Very specific: line 39
All shared compliance stages restore the solution, submit Component Governance inventory, and run the official OSPO notice@0 task through …
- Distinctive: line 49
Keep the enclosing jobs enabled: Windows artifact/lifecycle validation, PowerShell shipping-payload checks and module build/tests, NOTICE …
- Very specific: line 103
Default RIDs: linux-x64, win-x64, osx-arm64.
- Common: line 123
Keep project guards, branch/tag validation, and secret-source patterns intact.
- Distinctive: line 125
Keep checkout tasks on the Azure Pipelines default of no automatic task retries.
- Very specific: line 127
Do not add new triggers or pr: scopes without confirming the intended project and channel.
≈ “Common” is an estimate: at least 1 in 5 of the 40,246 AGENTS.md files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Azure DevOps Pipelines — Agent Guide
Scoped guidance for the Azure DevOps (ADO) CI/CD pipelines under .azure-pipelines/.
Read this before editing any pipeline YAML. Packaging/build logic invoked by the
pipelines lives in devops/scripts/; keep the two in sync. When you add or change a
stage, job, pipeline, trigger, variable/group, secret source, or artifact, update this
guide in the same PR so it stays accurate.
Essentials
- Pipeline YAML is authored for Azure DevOps, not GitHub Actions (
.github/workflows/is separate). - Entry pipelines live directly in
.azure-pipelines/; reusable templates live in.azure-pipelines/templates/. - Never inline secrets. Credentials come from variable groups, Azure Key Vault, approved Azure service connections (e.g.
ame_esrp_connection,AzureSubscription), and built-in pipeline authentication (e.g.persistCredentials: trueon checkout). - Signing and release-orchestration work runs in the
releaseADO project; PR (pr-alpha) andbetabuilds run inpublic. The stable-release pipeline runs its full build inrelease. - Keep changes template-driven: prefer editing a shared template over duplicating steps in an entry pipeline.
- Inline Bash follows the same SIGPIPE rules as
devops/scripts/: match captured output with here-strings, drain streaming checks with non-quietgrepredirected to/dev/null, and usesed -n '1p'instead ofheadfor first-line selection from unbounded pipelines. Keeppipefailenabled so producer failures remain visible.
Entry Pipelines
| File | Trigger | Project | Purpose |
azclips-alpha-build.yml | PR to any branch (pr: '*', autoCancel) + daily scheduled main run (cron '0 0 * * *', always: true, for Component Governance) | public | PR validation + unsigned build (release_channel: pr-alpha). |
azclips-beta-build.yml | CI on main (batched) | public | Unsigned beta build; optional sign_beta param adds a sign-beta build tag. |
azclips-beta-sign.yml | Daily scheduled main run (cron '0 0 * * *', always: true) + pipeline resource betaBuild tagged sign-beta | release | Scheduled/manual runs default to the latest successful main beta build without requiring a tag; ESRP-signs the selected build, verifies signatures/content, and runs the full native lifecycle matrix against the signed archives. |
azclips-trigger-stable-release.yml | Manual (guarded) opens the PR; path-trigger on src/CLI/Core.Cli.csproj | release | Manual run bumps CLI and changed extension/PowerShell module versions, then opens the release PR via gh (Key Vault PAT). After the PR merges, a CI run of the same pipeline (CreateStableTag) creates the stable tag via git tag/git push. |
azclips-stable-release.yml | Stable tag v*.*.*.*T*Z | release | Full build (in release) → ESRP sign → verify → signed lifecycle validation → publish GitHub release. In parallel after verify, signed PowerShell images are built/validated and CLI + PowerShell images are published to the ACR repositories configured by the Docker*Registry*/Docker*Repository variables in the entry pipeline, then verified from ACR and from MCR after a 10-minute delay. |
Template Layout (templates/)
templates/variables.yml— top-level shared variables (pools, project names, repo, service connections, pipeline names).templates/dist/variables/—common.yml,packaging.yml(script/out roots, RIDs),release.yml(ESRP keycodes).templates/dist/stages/— stage-level composition (build-unsigned-distribution.yml,sign-with-esrp.yml,validate-pull-request.yml,validate-signed-distribution.yml,component-governance.yml,init-resolve-version.yml,publish-docker-to-acr.yml,publish-to-github-release.yml,verify-signed-distribution.yml,build-ps-modules.yml). The PR validation stage checks title/history conventions, blocks manual root changelog or project-version edits, and restricts release-bot stable PRs to generated metadata paths and version-only project changes.templates/dist/jobs/— per-platform build/validate/sign jobs (linux, windows, macos, ps-modules, nuget), signed PowerShell installer validation, plustest-suite.yml(parallel Linux/Windows/macOS Unit Tests and Ubuntu Scenario Tests jobs),benchmark-suite.yml,finalize-build-summary.yml.templates/dist/steps/— small reusable steps (get-github-pat-token.yml,validate-release-project.yml,generate-cg-notice.yml).- Security validations (modeled on azure-cli and azure-powershell):
component-governance.ymlruns Component Detection, Credential Scanner (CredScan@3, suppressions indevops/scripts/compliance/CredScanSuppressions.json) and PoliCheck over the repository sources, covering CLI and PowerShell;PostAnalysis@2breaks the build on CredScan/PoliCheck errors. The unsigned branch ofvalidate-build-windows.ymlruns BinSkim on the downloaded.dll/.exefiles (excludingmsalruntime*.dlland the third-party prebuilt Copilot runtime binaries underMicrosoft.Azure.Azclips.Extensions.Agent/deps/runtimes/**/native/**, which fail BA2008/CFG and are not built here) for bothwin-x64andwin-arm64lean/full matrix entries, publishesCodeAnalysisLogs_<artifact>, and breaks on BinSkim errors. Signed lifecycle validation is unchanged. Both ARM64 matrix scans executed in build 363065, so the duplicate x64-hosted ARM64 scan has been removed; finalization still requiresWindowsValidationto succeed. - PowerShell binary security:
build-ps-modules.ymlcomposes the UbuntuBuildPSModulesstage and the dependent WindowsValidatePSModulesstage. The latter runsPSBinaryAnalysisfromvalidate-ps-security.yml. It checks out the repository for the health-check script and policy metadata, downloads the configured PowerShell artifact (PSModulesin the shared distribution pipeline), and scans.dll/.exefiles recursively underartifacts/PSGallery/modules, the shipping module folders passed toPublish-Modulebypackage_az_modules.ps1. This includes packaged cmdlet assemblies, core/extension assemblies, and bundled dependencies without an architecture filter, rather than unrelated solution outputs such asartifacts/Core.Agent/runtimes/. It excludes onlymsalruntime.dll,msalruntime_arm64.dll, andmsalruntime_x86.dll, matching classic PowerShell; no Copilot exclusion is applied within the shipping payload. It requires the shipping directory and cmdlet assemblies to be present, publishesCodeAnalysisLogs_PSModules, and breaks on BinSkim errors. Finalization waits forValidatePSModulesand requires both the module build and binary analysis to succeed; no duplicate external CredScan invocation is needed for the existing repository-wide source coverage. Unsigned Windows validation resolves the single unsignedazcli[-lean]-*-$(Rid).zipfrom the downloaded artifact, extracts it under$(Agent.TempDirectory)/binskim-cli/, requiresaz.exein the extracted root, and scans that extracted content, so the shipped zip is what is analyzed. PowerShell requires its shipping directory and cmdlet assemblies. adding exact filenames fromdevops/scripts/compliance/binskim-runtime-exclusions.jsondirectly under the extracted archive root. templates/dist/steps/— small reusable steps (get-github-pat-token.yml,validate-release-project.yml).
Component Governance and NOTICE
- All shared compliance stages restore the solution, submit Component Governance inventory, and run the official OSPO
notice@0task throughgenerate-cg-notice.yml. Restore, detection, generation, or output-validation failures fail the stage; there is no custom-generator fallback. Compliance_Results_<stage_name>retains<stage_name>/NOTICE.generatedalongside the existing security results. Stage-specific output directories prevent the OSPO task's own artifact uploads from colliding between unsigned and signed compliance stages.- Generated NOTICE differences are reported for review, not copied into build outputs. Alpha, beta, and stable packaging all continue using the root
NOTICEfrom their checked-out commit; stable packages use the reviewed file from the tagged commit. - The manual stable-release trigger runs the same generation steps after preparing version and changelog updates, refreshes root
NOTICEonly when normalized attribution content changes, and includes that change in the release PR. It publishes the raw output asCompliance_Results_StableReleaseNoticeoncePrepareNoticeResults.Readyconfirms the output directory exists; earlier failures skip evidence publication instead of reporting a missing artifact directory. The post-merge tag stage does not regenerate NOTICE. - Both the generated-PR file policy and the post-merge tagging allowlist permit root
NOTICE. Tagging still requires a version-only CLI project change and rejects unrelated files.devops/scripts/ci/test_stable_release_tag.pyexercises the tagging Bash from this pipeline against local Git repositories, without contacting GitHub. - Missing ClearlyDefined entries remain OSPO task warnings, not generation failures. NOTICE selections are pipeline/job-specific and must be reviewed for each pipeline, including the stable-release trigger. The OSPO extension must be installed in the organization.
Fork PR Security Coverage
- Guardian does not support forked GitHub PR builds, but the classic Azure CLI and Azure PowerShell pipelines apply no
System.PullRequest.IsForkcondition to their CredScan, BinSkim, log-publication, or PostAnalysis steps, so azclips does not either. The CredScan, BinSkim, BinSkim health-check, log-publication, and PostAnalysis steps run on every build and keep only their originalsucceeded()/succeededOrFailed()conditions. Any additional azclips-specific health check must report problems as warnings (##vso[task.logissue type=warning]) rather than fail the build. - Keep the enclosing jobs enabled: Windows artifact/lifecycle validation, PowerShell shipping-payload checks and module build/tests, NOTICE generation, and Component Detection still run. Do not relax finalization to accept skipped or failed jobs. No fork-specific warning steps are emitted.
- PostAnalysis still breaks on BinSkim and CredScan Error findings. The report-presence check (
verify_binskim_results.ps1) is warning-only and never fails the build. Do not useGDN_SUPPRESS_FORKED_BUILD_WARNINGto hide missing coverage. - The alpha pipeline does not sign or publish a release. Beta signing is separately gated by its manual/branch checks and pipeline resource; stable signing/release must consume trusted sources and successful validation. A successful fork build is not evidence of Guardian approval. Fork permissions, contributor approval, isolated agents, feed/service-connection access, and secret availability must be enforced through Azure DevOps settings; PR-editable YAML conditions are not a security boundary. Existing persisted checkout credentials in
Initand PR metadata validation require least-privilege review. No additional secrets or permissions are enabled by this handling.
Build Graph (unsigned distribution)
build-unsigned-distribution.yml fans out from an Init stage that resolves the version:
ComponentGovernanceandBuildPSModulesdepend onInit.BuildPSModulesretains its existing Ubuntu build-time module checks. Its common build job initializesPsValidationInstalledto false and sets it only after successful installation; Uninstall usesalways()with that marker so cancellation or later failures cannot skip owned-module cleanup. The separateValidatePSModulesstage depends on it and runs WindowsPSBinaryAnalysis; finalization waits for both stages and enforces their results before artifact collection and downstream signing/release.BuildCommondepends onInit.BuildLinux,BuildWindows,BuildMacOS,Test, andBenchmarkdepend onInit+BuildCommonand can run in parallel.ValidateWindowsdepends onInit+BuildWindows, and runsWindowsValidationincluding unsigned x64 and native ARM64 BinSkim and SARIF health checks. Build jobs only produce artifacts; finalization and downstream signing/release remain gated by validation results.BuildLinuxproduces Lean and Full archives for glibc (linux-x64,linux-arm64) and musl (linux-musl-x64,linux-musl-arm64). Each archive receives one full installer, layout, and runtime validation in a compatible environment: glibc on Ubuntu and musl in Alpine. Arm64 runtime checks require a matching Arm64 agent.- Each platform validation stage depends on
Init+ its corresponding platform build. - The
Teststage runsUnitTestsLinuxonubuntu_pool,UnitTestsWindowson the existing x64windows_pool,UnitTestsMacOSon the Microsoft-hostedmacos_arm64_poolimage, andScenarioTestson Ubuntu in parallel. All three unit-test jobs restore and build the complete solution in Release before running tests with--no-build, excludingScenario.Tests, ensuring exporter fixture tests see a complete, current set of extension artifacts. All three unit-test jobs publish TRX results, including after test failures. Windows runs the isolated native-console regression inCli.Tests; that test is skipped on non-Windows platforms. Scenario tests and pipeline input safety tests remain Linux-only. Finalization requires the entireTeststage to succeed, without listing its internal jobs. build-unsigned-distribution.ymlretains the established combined Docker behavior behindbuild_docker_images(defaulttrue) and independently selects unsigned CLI and PowerShell images throughbuild_cli_docker_imagesandbuild_powershell_docker_images(both defaulttrue). Alpha and beta therefore continue producing both image families from unsigned artifacts.- Docker build, publish, and verification stages depend directly on
Initand consumeSetCoreVersion.ArtifactVersion; they do not independently derive a Docker version. - ACR publish and the AMD64 published-image pull job follow classic release-agent convention and expect
azon the AMD64 agent. The AMD64 job pulls every published digest and exports per-image pipeline artifacts; native verification jobs load those artifacts and run smoke tests, so ARM64 agents require Docker but not Azure CLI or ACR credentials. publish-docker-to-acr.ymlbuilds PowerShell images from signed artifacts, thenValidateSignedPowerShellDockerImagesloads each downloaded AMD64/ARM64 archive on a native agent and smoke-tests it (expected Az version frompowershell-version.txt), mirroringValidateDockerAzureLinux3for CLI images.PublishDockerImagesToAcrdepends on it. Docker build jobs (signed and unsigned) only build and publish the image artifact; smoke testing happens once per image in the dedicated validation stages, not inside the build jobs.- Docker publication follows classic retry behavior in both test and production: existing immutable version tags are retained and verified downstream rather than rebuilt under candidate tags.
- Both
azclips-stable-release.ymlandazclips-stable-release-test.ymlset the target ACR repositories through theirDocker*RegistryName,Docker*RegistryServer, andDocker*Repositoryvariables, which are passed topublish-docker-to-acr.yml; nothing in the template or scripts hardcodes them. Repositories must be onboarded with MAR before publishing, and must start withpublic/orunlisted/so MCR serves them anonymously (the MCR path drops that prefix). Unlisted images allow anonymous pulls and public tag listing but are excluded from the public catalog and discovery portal. After ACR publish, a server-side 10-minute delay (WaitForMcrSync, matching the classicWait for MCR Syncphase) runs in parallel with ACR verification; thenVerifyMcrDockerImageschecks, with one retry after a 2-minute gap, that each versioned manifest tag exists onmcr.microsoft.com/<repo without the public/ or unlisted/ prefix>, pulls it anonymously on native AMD64/ARM64 agents, and runs the smoke tests, which check the version (no digest comparison, as in the classic release). These stages always run in the stable and stable-test pipelines; alpha and beta builds never call this template, so they skip signed PowerShell images, ACR publish and MCR verification. Only immutable version tags are published; aliases are not promoted. - CLI tags follow the classic
azurelinux3.0convention; full architecture tags omit afullqualifier, andVERSION-azurelinux3.0combines them as the default full multi-architecture image. PowerShell tags follow classicazurelinux-3.0spelling. - PowerShell validation runs as a single
ValidatePSstage (depends onBuildPSModules). Its matrix configuration comes from twobuild-unsigned-distribution.ymlbooleans, both defaulting tofalse, which each entry pipeline sets explicitly:limit_ps_testing(onlytestInAlphaentries, no discovery) andskip_ps_version_check(no distribution/PowerShell version discovery). Alpha sets bothtrue; beta sets bothfalse(full matrix plus discovery); stable and stable-release-test set onlyskip_ps_version_check: true. The stage does not read the resolved release channel. Finalization checksdependencies.ValidatePS.resultin its stage-level condition, covering matrix generation and every validation job;SucceededWithIssuesremains acceptable. - PowerShell validation matrix phases are Bootstrap, Install and Uninstall. Install requires
PsValidationBootstrappedand validates that every packaged module imports at its exact packaged version, exports its manifest cmdlets and has help examples; Uninstall requiresPsValidationInstalled. Cancellation still skips new validation. Reports/publication gates retain earlier failures. - Validation bootstraps use SHA256-verified standalone PowerShell GitHub release archives with their bundled runtime, not separate .NET installers or NuGet tools. Matrix runtime channels remain compatibility/report metadata; phases invoke the isolated executable directly without
DotnetRootPathor runtime PATH reconstruction. The preparation job's pipeline fixtures include offline archive-bootstrap coverage using bash and jq. - The PowerShell matrix-generation job reads
ps_validation_matrix.jsondirectly with jq, without Python/YAML dependency setup. It retains actual generation, but not the separate matrix self-test step (that fixture remains available locally). Native Windows supports configured numeric versions andlatest, which selectswindows-latest; this alias does not change PowerShell support/failure policy. - PowerShell preparation jobs route
pool-*values throughpool.name, while hosted image labels usepool.vmImage. Generated matrix legs useDistributionPoolNameandDistributionVmImage: named pools receive an empty image, and hosted images select theAzure Pipelinespool. Do not pass named pool identifiers as image labels. Finalizegates assembly once through stage-leveldependencies.<stage>.resultchecks. Required stages must succeed; onlyValidatePSandComponentGovernancemay succeed with issues. Missing, skipped, failed or canceled required stages skip all ofFinalize, rather than running a green summary with skipped publication. Docker build/validation stages are required only when Docker artifacts are included in the final distribution. The assembly job has no internal job-result lookups or repeated result conditions; only optional Docker downloads keep success-aware flavor conditions. There is no always-running textual summary. Adding jobs or tasks within an existing prerequisite stage needs no finalization changes. Regression coverage intests/Scripts/PS/PSValidationPipelineFixtures.ps1exercises every dependency result and Docker flag combination.
ArtifactVersion is produced by Init (SetCoreVersion.ArtifactVersion) and consumed by downstream stages via stageDependencies.
Projects & Context Guards
public— PR (pr-alpha) andbetabuilds. No ESRP access.release— beta signing, stable release trigger, and stable release. Has ESRP + GitHub PAT access.templates/dist/steps/validate-release-project.ymlenforces that signing/release pipelines only run inrelease. Preserve these guards when editing.
Variables, Groups & Secrets
- Queue parameters and upstream build metadata in release preparation, beta tagging, beta signing preflight, and signed Linux musl validation are mapped through task
envand consumed as quoted Bash data, never interpolated into script source. Preserve this boundary when adding inputs or log messages. - The agent treats
##vso[anywhere in an output line as a logging command. Print these untrusted values through the step'slog_valuehelper, which rewrites the marker to##vso_[; intentional logging commands remain literal script output. - Stable branch preparation does not receive
GH_TOKEN; the credential check runs in the authenticated commit/PR step. Changelog updates and tag/push operations retain their existing explicit credential mappings. - The shared
UnitTestsLinuxjob runs credential-free pipeline input regression tests before .NET tests:python3 -m unittest discover -s devops/scripts/ci -p test_pipeline_input_safety.py -v. These exercise the actual YAML Bash and environment mappings without running pipelines or accessing remote resources. - Shared pool, project, repository, service-connection, bundle, and pipeline-name values are defined in
templates/variables.yml. - Variable groups (attached only when
System.TeamProject == 'release'):AME ESRP Variable Group,esrp-signing-codes,azclips-telemetry,get-github-pat-token. azclips-telemetrysupplies the secretAriaConnectionStringused only during stable and stable-test compilation. Shared build jobs map it toAZCLIPS_ARIA_CONNECTION_STRING;Core.Telemetry.csprojembeds it as assembly metadata when supplied. PR, beta, and local builds fall back to the committed development connection string inWellKnownEndpoints. The stable preflight fails before compilation when the variable is missing.- ESRP keycodes (
ESRPNuGetKeyCode,ESRPAuthenticodeKeyCode,ESRPThirdPartyKeyCode,ESRPStrongNameKeyCode,ESRPAppleKeyCode) come from groups and are mapped inrelease.yml. Never hardcode them. - The GitHub PAT is fetched at runtime from Key Vault via
steps/get-github-pat-token.yml; do not persist it. - Some jobs also rely on service connections (
ame_esrp_connectionfor ESRP,AzureSubscriptionfor Key Vault) and persisted checkout credentials (persistCredentials: true, for checkout/fetch). Release Git tag/push andghoperations authenticate with Key VaultGH_TOKEN. Do not introduce release-only secrets into public-project jobs.
Packaging Roots (packaging.yml)
- Native installer lifecycle jobs exercise release metadata/download and piped-invocation paths using local HTTP-command fixtures backed by the selected pipeline archive. Linux/macOS share
packaging/common/validate_cli_download.sh, which restricts the installer environment to its declared system utilities. Windows uses scoped HTTP fixtures, and signed PowerShell validation runs the module bootstrap and bundled helper in isolated processes. PackagingScriptsRoot = devops/scripts/packaging- Extension download-only helper checks run inside the same native CLI lifecycle jobs: Bash through the shared CLI fixture, and PowerShell through
common/test_extensions_download.ps1. Both build fixture bundles from the downloaded pipeline extension packages and check pinned releases, failure preservation, and cleanup without live release downloads. PackagingOutRoot = devops/out(withcommon/,linux/,windows/,macos/subfolders)- Default RIDs:
linux-x64,win-x64,osx-arm64. - Pipeline jobs shell out to
devops/scripts/(ci/,compliance/,packaging/,publishing/). When changing a build step, update the script there rather than embedding logic in YAML.
Artifacts
Final_Build_Distribution— unsigned build output.Final_Signed_Distribution— stable ESRP-signed output.Final_Signed_Beta_Distribution— beta ESRP-signed output.azclips-beta-signsets this fixed name throughSignedArtifactName; it has no queue-time parameters.PSModules— packaged PowerShell modules.Validate_PS_Sim_<ValidationKey>— schema-3 phase results, logs and lifecycle diagnostics for each matrix leg; Bootstrap, Install and Uninstall are all required for success.
Signing & Release Flow
- NuGet, Windows and PowerShell signing tasks combine payload-presence flags with
succeeded(), including restore, repack and ESRP verification steps. Optional payloads remain skippable, but no flag-controlled signing operation runs after a failed or canceled job.tests/Scripts/PS/PSValidationPipelineFixtures.ps1exercises these conditions for successful, warning, failed, canceled and skipped statuses. - Beta (on demand, unchanged): Manually queue
azclips-beta-build(public) withsign_beta: true→ addsign-betatag →azclips-beta-sign(release) consumes that exact completed tagged run via a pipeline resource → ESRP sign → verify → run all 16 Linux, Windows, and macOS lifecycle rows plus the signed PowerShell installer row against the exact signed archives. - Beta (daily):
azclips-beta-sign(release) also runs daily at 00:00 UTC onmain, even without source changes, and resolves itsbetaBuildpipeline resource to the latest successfully completedazclips-beta-build(public) run onrefs/heads/main, without requiring asign-betatag. Manual signing runs use the same default unless a resource version is explicitly selected. All paths pin downloads to the resolved resource run ID and use the same signing, verification, and lifecycle validation stages. - Stable:
azclips-trigger-stable-release(release, manual) bumps the CLI and top-level Az versions, detects extension code changes since the latest stable tag, independently patch-bumps each changed existing extension, preserves new extensions' declared initial versions, requires their PowerShell child changelogs, aligns their child manifests and Az dependencies, refreshes rootNOTICEfrom official CG generation when changed, and opens a release PR viagh. After that PR merges tomain, a CI run of the same pipeline (CreateStableTag, conditionIndividualCI/BatchedCIonrefs/heads/main) creates the tagvX.Y.Z.yyyyMMddTHHmmssZviagit tag/git push→ the tag triggersazclips-stable-release→ build →sign-with-esrp→ component governance → verify → signed lifecycle validation →publish-to-github-release(and, in parallel,publish-docker-to-acr; the same stages run inazclips-stable-release-testwith its own repository variables).. validate-signed-distribution.ymldownloads the flat final signed artifact in each native matrix job, requires exactly one matching archive per RID/profile, stages its signed extension packages for the existing lifecycle harnesses, and passes the archive path explicitly. A separate Ubuntu job executes the bundled installer from the exact signedazps-cmdletsarchive, imports a child module at its packaged version, and verifies numeric version inference. Validation never rebuilds, modifies, repacks, or resigns a publication candidate.- macOS notarization uses
macos_bundle_id: com.microsoft.azclips.cli. Outermost.app,.framework,.xpc,.appex,.plugin, and.bundledirectories with Apple bundle metadata are sent to ESRP as complete signing units rather than signing their nested Mach-O files separately; unrecognized Mach-O-bearing code containers fail closed. Signing ZIPs are created and extracted on macOS with symlink preservation and remain opaque on Windows. Reconstructed payloads must pass strictcodesign, Microsoft Team ID, hardened-runtime, timestamp, and required .NET entitlement checks before notarization ZIPs are created.
Editing Rules for Agents
- Change shared behavior in
templates/dist/**, not by copy-pasting into entry pipelines. - Keep project guards, branch/tag validation, and secret-source patterns intact.
- Match existing parameter naming (
ubuntu_pool,release_channel,source_artifact_name, etc.) and pass pools through parameters. - Keep checkout tasks on the Azure Pipelines default of no automatic task retries.
- Validate YAML changes: check indentation, template
parameters/variableswiring, anddependsOn/stageDependenciesreferences before committing. - Do not add new triggers or
pr:scopes without confirming the intended project and channel.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

