Branch control check became case-sensitive: refs/heads/RC/* stopped matching refs/heads/rc/* branches (Nov 2026)

Duncan Palmer 0 Reputation points
2026-11-09T22:10:24.07+00:00

The Branch control check on one of our environments started failing for a branch that matched the same configuration three days earlier. Nothing changed in the check configuration or our branch naming.

Our release candidate branches have always been lowercase (rc/yyyy-mm-dd, back to at least August 2026). The environment's Branch control check has allowed refs/heads/RC/* all that time, and deployments from rc/... branches have passed without problems.

3 Nov 2026: passed

Task : Branch control
Version : 167.0.1
Check inputs:
 Allowed branches:refs/heads/master,refs/heads/env/prod, refs/heads/hotfix/*, refs/heads/RC/*
 Ensure consumed branch is protected: false
Verifying branch for self:
Repository: <redacted>
Branch: refs/heads/rc/2026-11-03
Result for evaluation: Successful
Check evaluation succeeded
```**6 Nov 2026: failed**

```yaml
Task : Branch control
Version : 167.0.1
Check inputs:
 Allowed branches:refs/heads/master,refs/heads/env/prod, refs/heads/hotfix/*, refs/heads/RC/*
 Ensure consumed branch is protected: false
Verifying branch for self:
Repository: <redacted>
Branch: refs/heads/rc/2026-11-06
Result for evaluation: Unsuccessful
Check evaluation failed
```**What we've ruled out:**

- The check configuration is identical in both runs.
- Every `rc/` branch in the repo is lowercase. There have never been any `RC/` branches.
- Retrying the stage failed again immediately, so it isn't transient.

**Workaround:** adding `refs/heads/rc/*` to Allowed branches fixed it.

**Questions:**

1. Did Branch control pattern matching change from case-insensitive to case-sensitive recently? The timing lines up with the Sprint 281 rollout (notes dated 27 Oct 2026), but those notes don't mention checks.
2. If it was intentional, can it be documented? Organisations with mismatched casing in their allowed-branch patterns will see deployments blocked with no warning.
3. If it wasn't intentional, is it a regression that will be reverted?
Azure DevOps
0 comments No comments

1 answer

Sort by: Newest
  1. AI answer

    2026-11-09T22:11:29.8033333+00:00

    Keep the allowed pattern as refs/heads/rc/*; the observed evaluations show that Branch control now distinguishes it from refs/heads/RC/*, while the available Microsoft documentation does not establish whether that November change was intentional or a regression.

    1. In Pipelines → Environments → your environment → Approvals and checks → Branch control, retain the exact-case pattern:
         refs/heads/master,refs/heads/env/prod,refs/heads/hotfix/*,refs/heads/rc/*
      
    2. Audit other Branch control checks—including checks attached to service connections, repositories, variable groups, secure files, and agent pools—for case mismatches. Branch control evaluates every linked resource and fails the stage if any branch does not match the allowed list. Patterns must use fully qualified names such as refs/heads/rc/*. ^1^
    3. Standardize allowed patterns to the repository’s actual ref casing. Azure Repos treats refs differing only by case as separate refs, and Microsoft recommends consistently using lowercase branch and tag names to avoid case conflicts. ^2^

    Your workaround is therefore the safest permanent configuration unless Microsoft later confirms and reverts the changed evaluation behavior.

    Answers to the three questions

    1. Did Branch control matching recently become case-sensitive?

    The two logs demonstrate an effective behavior change between 3 November and 6 November 2026 for your organization: the same task version and configuration first accepted and then rejected a case-mismatched ref.

    However, the public documentation does not confirm a Branch control rollout changing matching from case-insensitive to case-sensitive. The Sprint 281 Azure Repos notes list Copilot review-comment and auditing changes, but no Branch control matching change. ^3^

    The earlier Sprint 248 change is not evidence of this particular change. It concerns the cross-repository policy branch-candidate preview, which was corrected to reflect already-case-sensitive policy matching—not Environment Branch control. ^4^

    Because both runs report Branch control task version 167.0.1, the evidence does not indicate an agent task-version update. It is consistent with a service-side behavior change, but the logs alone cannot establish its cause or intended status.

    2. If intentional, should it be documented?

    Yes. The current Branch control documentation says to provide a comma-separated allowed list, use fully qualified refs, and notes that a nonmatching branch fails the stage, but it does not explicitly state whether matching is case-sensitive. ^1^

    A documentation issue should request explicit wording such as:

    Branch control branch and wildcard matching is case-sensitive; allowed patterns must match the casing of the fully qualified Git ref.

    Include your sanitized before/after logs because they demonstrate the operational impact without relying on assumptions about the rollout.

    3. Will it be reverted?

    No public source supplied here announces this as a regression or commits to a revert. Only the Azure DevOps product team can classify it and provide a disposition.

    Open an Azure DevOps support request or Developer Community report containing:

    • Organization and project identifiers through the private support fields.
    • Environment name.
    • Successful and failed run IDs.
    • UTC timestamps and deployment geography, if known.
    • The identical Branch control task version (167.0.1).
    • The exact allowed pattern and evaluated ref.
    • Confirmation that retry reproduced the failure.
    • Confirmation that changing only RC to rc resolved it.
    • A request to classify the change as intentional or regression and update the release notes/documentation accordingly.

    Do not remove and recreate the environment or check: your A/B result already isolates casing, and recreating it would not answer whether the service behavior changed.


    References

    1. Define approvals and checks
    2. Case sensitivity - Azure Repos | Microsoft Learn
    3. Azure DevOps Release Notes - Azure Repos Sprint 281 Update
    4. Azure Repos - Sprint 248 Update
    AI-generated content may be incorrect. Read our transparency notes for more information.

    Was this answer helpful?

Your answer

Answers can be marked as 'Accepted' by the question author and 'Recommended' by moderators, which helps users know the answer solved the author's problem.