Repository navigation
feat: ADR GA - #906
feat: ADR GA#906Hangyi (HangyiWang) wants to merge 33 commits into
Conversation
Generate ADR/CMS, Hub management, DPS management and DPS data clients for 2026-11-01, and Hub data clients for 2026-11-01-preview. Preserve modeless synchronous generation. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Port supported commands and tests from release/1.0.0-preview, apply the stable API exclusions and compatibility adapters, and document generation provenance and offline qualification. Preserve baseline Hub, DPS and Device Update behavior. Validation: 9726 unit tests passed; Flake8 and Pylint passed; the 1.0.0 wheel and native CLI help were verified. No live integration qualification was performed. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Preserve the implementation plan and qualification report as local session artifacts only. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Restore release ADU path handling and owned Hub fixtures with their regression tests. Adapt namespace cleanup and real SDK 404 proofs to supported GA children, keep preview-only Hub skips out of GA, and remove mechanical test artifacts. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Reuse release/1.0.0-preview at 734e82d, including concurrent owned Hub/DPS phases, ADR worker groups, locked installs, readiness recovery, and the missing CI regression coverage. Preserve GA SDKs, API pins, supported command scope, and existing cleanup safeguards. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Restore exact source parity for SAS phase tests and the DPS canary response URL while preserving GA API assertions and public endpoint defaults. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Port supported release-preview schema commands and test infrastructure. Preserve stable Hub and DPS command behavior, refresh Hub SDKs, and add offline and live-scenario regressions. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
There was a problem hiding this comment.
🟡 Changes recommended
Link removal still performs an unconditional stale full-resource PUT that can overwrite concurrent namespace changes.
1 open finding
What changed in this PR
Prepares the Azure IoT extension 1.0.0 GA surface, regenerating ADR, IoT Hub, and DPS SDK integrations for API version 2026-11-01.
Changes:
- Promotes supported commands from preview and updates generated modeless SDKs.
- Adds authentication, validation, integration-target, and release safeguards.
- Adds relative-path support for Device Update hash calculation.
| File | Description |
|---|---|
setup.py |
Raises SDK dependency floors and marks the package stable. |
README.md |
Documents 1.0.0 scope and installation requirements. |
docs/*, linter_exclusions.yml |
Updates installation and command-lint guidance. |
scripts/select-openssl.sh |
Selects OpenSSL 3 for macOS tests. |
dev_requirements, CredScanSuppressions.json |
Updates test and security tooling. |
.github/workflows/* |
Pins actions and updates CI/release qualification. |
.azure-devops/* |
Updates CLI setup and integration execution. |
.github/skills/generate-typespec-sdk/SKILL.md |
Updates SDK-generation guidance. |
azext_iot/sdk/iothub/** |
Replaces legacy Hub clients with modeless GA SDKs. |
azext_iot/sdk/dps/** |
Replaces legacy DPS clients with modeless GA SDKs. |
azext_iot/sdk/deviceregistry/** |
Adds GA ADR operation groups and API version. |
azext_iot/adr/** |
Adds GA command arguments, routing, and endpoint persistence. |
azext_iot/iothub/** |
Adapts Hub providers, authentication, and state handling. |
azext_iot/dps/** |
Adds GA registration, enrollment, authentication, and CSR behavior. |
azext_iot/core/** |
Adds DPS validation and modeless output transforms. |
azext_iot/deviceupdate/commands_update.py |
Resolves relative paths before producing file URIs. |
azext_iot/{commands.py,constants.py,__init__.py,azext_metadata.json} |
Promotes extension metadata and command registration to GA. |
azext_iot/tests/** |
Expands unit and integration coverage for the GA migration. |
🧠 Review effort: Balanced
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Azure SRE Agent - automated reviewReviewing Scope note (important): this PR is 522 files / +131847 / -33906. The bulk is regenerated SDK ( Blocking None found in the reviewed surface. Suggestions
Nits
Things I specifically checked and found correct
This is an automated review and may be incomplete; given the size of this PR it is explicitly a partial review of the non-generated surface. Please verify findings independently. |
Require response-header ETags for ADR unlink replacement writes, preserve ADU symlink URIs, retain original DPS registration diagnostics, and report missing Homebrew explicitly. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
|
Addressed the remaining review recommendations in 86969d5:
Local validation: 3,040 relevant GA unit cases passed, flake8 passed, pylint 10/10, and all changed executable production Python lines were covered. Integration suites were not run. |
| get_adr_arm_endpoint(cli_ctx.cloud.endpoints.resource_manager), | ||
| api_version=_ADR_IOT_HUB_API_VERSION, |
Azure SRE Agent - automated reviewReviewing This increment answers the previous review's two nits and Copilot's unlink-concurrency comment. I verified each claim rather than taking the summary at face value. Blocking
Suggestions
Nits None blocking in the rest of the increment. Checked and clean
Unrelated to this increment but still open: Copilot's inline comment on Automated review — scoped to the increment only; the rest of this 522-file PR was covered by the previous partial review and is not re-reviewed here. |
Freeze requested and observed provisioning fields individually so successful authorization recovery can populate omitted fields without hiding subsequent drift. Share the comparison with integration readiness checks. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Azure SRE Agent - automated reviewReviewing No blockers. 0 new suggestions. This increment refactors Verified the 4 new unit cases match the implementation: non-dict/non-dict-coercible settings Automated review, unverified. 0 clean checks recorded in state. |
Preserve every selected case and existing timeout while giving the two identity round trips an independent owned phase and 75-minute runtime budget. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Azure SRE Agent - automated reviewNo blockers. 1 suggestion on
Checked: new Automated review, unverified. 4 clean checks recorded in state. |
Preserve the existing 900-second lifecycle allowance in addition to the two fresh-role propagation waits. Keep the shared phase and CLI timeouts unchanged. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Align wait errors, ADR unlink completion and ETags, DPS certificate ETag lookup, authentication and key-output defaults, allocation validation, hostname discovery, and linked-hub no-op validation. Preserve GA SDK compatibility and reliability coverage. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Use the device hostname when available and retain the classic fallback. Cover managed-identity create, conversion and reuse for both hostname shapes. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Keep the real timer and handler assertions, observe two fresh ticks with a bounded wait, and cover deferred signal delivery explicitly. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Batch independent role grants, reuse the phase-owned Hub for read-only checks, skip private ARM-only data grants, and overlap acknowledged pool creates with bounded owned-resource readiness checks. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Keep the offline receipt scope fixed while exercising CI default resource-group settings. Integration fixture code and the running live snapshot are unchanged. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
IoT Hub fixture setup improvements and local resultsAdded the six audited setup improvements in
Ownership, cleanup, authentication isolation, assertions, node IDs, readiness requirements, and explicit propagation windows remain intact. No production command changes, mutating retries, or ambiguous write replay were added. Offline: 1,609 targeted unit/dependent tests passed at Local live: 14/15 affected cases passed at frozen
Storage error evidence: Cleanup: independent GET-only verification confirmed all 53 recorded resource/child IDs returned 404, the original protected baseline was preserved, no extra resources remained, and temporary Azure profiles were removed. The failed storage native receipt remains failed. Measured overlap: Activity Log create intervals show 171.15 seconds of overlap for the control-state Hub pair and 168.84 seconds for the data-state pair, roughly 2m50s per pool. This is overlapping provisioning work, not measured full-workflow savings. The adapted |
|
GitHub CI is now green at the unchanged head |
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

Service APIs
2026-11-012026-11-012026-11-01Command changes
az iot du update calculate-hashwithout resolving symlink URIs.Test-only command coverage follow-up
Adds happy-path coverage for 13 DPS and 16 Hub commands in test-only commits. Two production issues exposed by these tests received explicit approval for separate fixes, documented below. Tests verify meaningful updates, unchanged keys and unrelated objects, certificate replacement/readback, and cleanup. Manual failover uses a dedicated owned Hub; module methods use a real connected module responder in the owned SAS phase.
centraluseuap, canary ARMa8a4aea3; linked-Hub show and registration deletion passed at5dd136a0, with their code and dependencies unchanged.a8a4aea3.bc8409a0, including real create/update/readback/delete after the TLS metadata filter fix.ead9afa6, after the TLS projection and authoritative-output fixes.9eaa6ca7, including setup, call, teardown and native gates. Setup took 696.4s, failover 523.5s and teardown 65.6s. All four recorded IDs were independently absent; baseline preserved and private profile removed.bc8409a0, with a real connected module responder and zero skips.The first DPS management attempt exposed an incorrect test assumption about independently round-tripping permission names. The test now explicitly requests paired enrollment/registration permissions and retains exact returned-rights assertions. Both DPS attempts have complete native cleanup plus independent absent-resource checks; baseline resources were preserved and temporary profiles removed. The original failed attempt remains recorded.
Opus 5.5/high reviews addressed void-output handling, narrowly scoped failover admission, correlated failover-operation completion before cleanup, the legacy ADO selection boundary, and the subsequent failover test corrections. Legacy ADO retains its previous partial roster; receipt-dependent cases remain required by the native controller.
The failed original Hub cohort has six independently absent recorded IDs and a preserved baseline, but its failed native gates remain failed. The TLS-fix rerun has complete native cleanup, two independently absent IDs, a preserved baseline and a removed private profile.
The module-method run also passed its native gates and cleanup; eight recorded IDs are independently absent, the baseline is preserved and its temporary profile is removed.
The policy/failover cohort has four independently absent IDs and a preserved baseline; its failed teardown and native gates remain failed.
Separately approved GA fixes exposed by live coverage
bc8409a0: exclude GET-returnedminTlsVersionMigrationmetadata from Hub PUT bodies. Preserve writableminTlsVersion, ETags and GET output. Opus 5.5/high review found no significant issues; 178 focused checks and linters passed. Live enrichment lifecycle passed.ead9afa6: policy create/delete wait for successful writes, then read policies through the existing list-keys API instead of assuming the completed Hub response containsauthorizationPolicies. Preserve policy/key output and error propagation. Opus 5.5/high review found no significant issues; 540 focused checks and linters passed. Live policy lifecycle passed.Full qualification follow-up
3721d01fcommits the GA registration/hostname contract assertions previously used in local qualification.08661af9fixes the storage test fixture's fresh managed-identity grants: use known object IDs regardless of caller type, avoiding Graph lookup/name hydration while retaining exact-ID cleanup and bounded visibility. Opus 5.5/high review, 401 focused unit tests and linters passed.3a70c034retains strict polling URL rejection while reporting only failed validation categories and forbidden path character codepoints. It also checks policy create/delete return values in live coverage. Opus 5.5/high review, 732 focused unit tests and linters passed.9eaa6ca7narrowly admits literal=in Azure-acknowledged opaque ARM polling paths. Scope, origin, correlated operation completion and no-replay guards remain enforced. Opus 5.5/high review included a red/green check proving the observed-DELETE regression fails without the fix.All 29 added command paths have passed across the documented focused GA runs. This is not complete-suite qualification.
The complete rerun at
9eaa6ca7started on 2026-10-17 at 21:11 UTC. It launched 33 Hub control, 53 Hub data and 68 DPS cases (154 total); the additional 17 ADR cases were not launched. Execution was stopped after the DPS local-auth update exceeded its 900-second phase budget and Azure rejected cleanup with HTTP 409 /409301, reportingIotDpsState: Transitioning. A read-only check at 22:07 UTC still returned both state fields asTransitioningwithdisableLocalAuth=true.Final evidence contains 110 recorded case passes, three Hub failures, five incomplete case receipts and 36 unreported cases. The Hub failures are storage endpoint authorization (
400117), migrate-controlplane-with-create deployment failure, and monitor-feedback assertion failure; their root causes are not yet established. Native cohort gates remain failed/interrupted. The DPS count excludes a synthetic unexpected JUnit identity.Shutdown also exposed a worker that outlived its controller; the worker has now exited. Recovery used copied ownership receipts and the native no-replay cleanup helper, preserving original execution gates. Independent verification at 22:07 UTC found 145 of 147 recorded IDs absent. Only the stuck owned DPS instance and its scoped role assignment remained; the baseline resource was preserved and temporary profiles were removed. This is the historical local-run snapshot, not the newer GitHub-run cleanup result.
The seven generated SDK defaults are
2026-11-01. Hub state export/import is a separate path: it invokesaz group export, preserves the returned resources'apiVersion, and submits them throughaz deployment group create. The GitHub ownership receipts confirm2026-05-01-previewdeployment targets; the existingblank_hub_arm.jsoncompatibility fixture also explicitly uses2022-04-30-preview. The ownership transport does not replace those versions. These passing snapshot/deployment cases are not evidence of GA-only template operations; SDK defaults do not control an ARM template's resource versions.CI for historical head
9eaa6ca7was 64/64 green. The preview counterpart is #935 at2ba1f894, with its last observed 27/27 green checks. It preserves preview-only contracts and preview's native poller. Preview live execution is still pending GA verification.Native GitHub qualification: 2026-10-18
Full selected run 39081726111 used exact commit
9eaa6ca7, Python 3.13,centraluseuap, and canary ARM, selecting all Hub control, Hub data, DPS, and ADR tests.All 154 Hub/DPS cases have passing setup, call, and teardown receipts, with no skips or missing cases. The earlier local Hub storage, migration, feedback, and DPS local-auth failures did not recur; this does not by itself establish their earlier root causes. The original workflow remains failed because of ADR, and the final summary correctly propagates that failure rather than hiding it.
Commit
f75e0aecfixes the two identified ADR issues:westus2location.ResourceMiNotAuthorized/ inbound400315envelope. It remains DPS-only, requires a grant created by this command, retains role/identity/snapshot checks and the two-retry limit, and does not retry arbitrary authorization failures or uncertain writes. The no-wait test readiness path recognizes the same exact envelope under its existing fresh-grant window.The fix passed 771 focused unit tests and existing linters; Opus 5.5/high review found no blockers. Both the fork PR branch and Azure-owned branch contain the fix.
Full ADR rerun 39084646411 used exact
f75e0aecwith the same Python, region, and endpoint. It finished at 01:46 UTC with 15 passed, 2 failed, all 17 case receipts complete and no skips. The schema registry lifecycle passed with the explicit region fix. The link lifecycle's DPS add also succeeded with zero recovery updates, before failing later on Hub add; it did not exercise the newly recognized DPS error envelope in this run.f75e0aecTestADRLinkLifecycle.test_adr_link_lifecycleAdrMiNotAuthorizedfor namespace-managed-identity data-plane read access. Azure's message now includes(endpoint 'secondary' being linked, resource '<Hub ARM ID>'); the old test helper rejected that context and attempted zero recovery updates. This confirmed test-helper compatibility gap is corrected incd9ab501; see the focused follow-up below.TestADRLinkDelete.test_adr_link_hub_dps_deleteInvalidLinkRequest/AdrMiNotAuthorizedfailures and exhausted the existing 600-second recovery deadline. Required outbound-identity Contributor assignments and repeated verification were confirmed, but the last actual PATCH was approximately 8m44s after grant creation. The run was blocked by service authorization; that does not prove propagation would never recover. The actual denied backend principal/token/cache decision is unavailable, so the ultimate cause remains unproven.Further live reruns initially stopped on that blocker as requested. PR CI for historical
f75e0aecwas 77/77 green, independently of the failed integration workflows. The user subsequently authorized the test-helper correction and a separate longer-window diagnostic below. Results at different commits and diagnostic timeouts are not combined into an all-green full-suite claim.Cleanup of the failed ADR scenarios initially left one DPS instance after a
409304rejection at 01:19:08 UTC. An independent ARM activity-log check confirmed that DELETE terminally failed with Conflict, and the preceding unlink notification subsequently succeeded at 01:21:04. After verifyingActive/Succeededand namespace absence, recovery submitted one DELETE for that exact owned DPS instance. At 01:52 UTC, its GET and scoped-role GET both returned HTTP 404. Together with the nine independently absent roots checked earlier, all ten roots of the two failed ADR scenarios are absent. Original failed execution and cleanup evidence remains preserved. The separate older local-run DPS remainder is not included in this cleanup claim.Focused ADR follow-up: 2026-10-18
cd9ab501corrects only the no-wait integration test helper: the contextual Hub message must match the exact Hub hostname, endpoint name, resource ID, andAdrMiNotAuthorizedcode, with no extra error fields. Existing legacy messages, identity/settings preservation, and retry bounds remain unchanged. No production CLI code or timeout defaults changed. All 450 focused unit tests and existing linters passed; Opus 5.5/high review found no blocking findings. Both GA remote branches contain this commit.The exact
TestADRLinkLifecycle.test_adr_link_lifecyclecase passed setup, call, and teardown in a focused native local run atcd9ab501, Python 3.10,centraluseuap, and canary ARM. It completed at 04:25 UTC using unmodified commands and normal timeouts. Independent GETs at 04:26 UTC confirmed all 15 recorded owned IDs absent, both baseline resources preserved, and the temporary profile removed. This run encountered no authorization failures: the lifecycle is live-green, while the new contextual recovery branch is covered by deterministic offline regressions.A separate
TestADRLinkDelete.test_adr_link_hub_dps_deletediagnostic ran from 04:26:50 to 04:45 UTC after fresh admission. A session-only wrapper supplied--timeout 1200to its waited DPS link add; all remaining commands, identities, automatic grants, recovery behavior, and assertions were unchanged. This is a diagnostic, not qualification under the default timeout.The original DPS outbound
AdrMiNotAuthorizeddenial did not recur. Instead, DPS returned the distinct inboundResourceMiNotAuthorized/400315error at 04:36:40. Existingf75e0aecrecovery submitted one identical, identity-preserving PATCH at 04:37:20; DPS linking succeeded at 04:38:52. The complete DPS command took 207.410 seconds, and success was observed 199.574 seconds after the inbound namespace-read Contributor grant was accepted. This live-exercised the existing inbound-error recovery but never used the additional ten minutes. It does not establish that a longer default timeout would fix the original outbound denial.The complete diagnostic case still failed, later on the second Hub add, before any unlink assertions. Its persisted
LinkCommitFailedsaid:The namespace's managed identity is not authorized to link the Hub resource. Grant it access on the resource, then resubmit the request. (Hub resource reported: [AuthorizationFailed]). This redacted error is not recognized by the production recovery classifier; no recovery update was submitted for this Hub. The corresponding namespace PATCH correlation is69b0c5f4-dd2d-4b5a-bb7e-506cd8fff4ddat 04:41:26 UTC. This is a separate failure, not the contextual Hub device-count message fixed incd9ab501. No further production behavior/default change or additional live attempt has been made pending the user's next decision.The diagnostic has complete failed-case receipts, with setup and teardown passed. Independent GETs at 04:46 UTC confirmed all 13 recorded owned IDs absent, both baseline resources preserved, and the temporary profile removed. Original failed receipts are retained.
The Hub helper correction is also mirrored in #935 as
d15a749a, preserving preview-specific fresh-grant behavior. All 461 focused preview tests and linters passed, with no blocking Opus 5.5/high review findings. GA PR CI atcd9ab501is 77/77 green. Preview PR CI atd15a749ais 24/24 green, with run 39097306705 completed successfully. Preview live testing remains pending; CI success does not replace live qualification.Full GA retry at cd9ab50: 2026-10-18
At the user's request, run 39099115825 reran all four selected suites at exact
cd9ab501c12016886cb28352bef03da544ceac11, Python 3.13,centraluseuap, and canary ARM. It used normal commands and timeouts, with no diagnostic overrides or additional code changes. The workflow finished failed.No cases were skipped. The 160 passes include complete setup/call/teardown receipts. Historical passes at other commits are not used to fill the seven unqualified Hub data cases.
test_register_and_issue_certificate_contract[deadline]assigned, and certificate-chain/correlation assertions passed. The next operation-status call returned the same operation ID but statusassigning. Failure is line 77's readback assertion, not the 180-second registration deadline; the whole test call took 47.9 seconds. The CLI returns that status response unchanged. The underlying readback inconsistency is not established.test_iot_storage_endpoint_lifecycle--identity [system]returned400117, saying the storage operation was not authorized with this permission. Correlationa719813c-3c11-4e8e-93e5-83b009ad1aca, 05:30:35 UTC. Propagation is plausible, but not proven. Manual failover passed.TestADRLinkLifecycle.test_adr_link_lifecycleAdrMiNotAuthorized; the helper recognized it and submitted one identity-preserving update. Subsequent reads remained Failed until the readiness deadline, without observed progress authorizing another update. This is not the contextual-message classification defect fixed bycd9ab501.TestADRLinkDelete.test_adr_link_hub_dps_deleteAdrMiNotAuthorizedrecovered within the normal timeout. The first Hub add then failed withLinkInitiateFailed, reporting Hub code400913. No unlink assertions were reached. This differs from the earlier second-HubLinkCommitFailed/AuthorizationFailed; the underlying rejection is not explained by the available error.Hub data's
entra-devices-protocolphase exhausted its 4500-second (75-minute) phase budget after 30 passes, interruptingTestIoTHubModules.test_iothub_module_identityduring module query visibility polling. That test had run approximately 618 seconds; its own 30-minute query-visibility allowance was not exhausted. Earlier device-identity and nested-edge cases passed after 907.5 and 1204.3 seconds respectively. The five-minute traceback dump is diagnostic output, not a five-minute test failure. Shutdown subsequently encountered a closed-progress-streamValueErrorduring cleanup.The six unstarted cases are
TestIoTHubModules.test_iothub_module_renew_key,test_iothub_module_connection_string_show,test_iothub_module_generate_sas_token,test_iothub_module_hostname_type_permutations, andTestHubPreview.test_identity_roundtrip,test_responding_digital_twin. Thus Hub data has seven unqualified cases, not seven assertion failures.Cleanup evidence is retained without rewriting failed native receipts. All three DPS phase cleanup receipts completed. Hub control completed three of four native cleanup receipts; independent read-only GETs confirmed all 20 recorded IDs, including six roots, absent for its failed phase. Hub data completed two of three native cleanup receipts; its interrupted phase had four roots absent but one scoped role still unattested. Independent read-only GETs subsequently confirmed all eight recorded IDs, including the four roots and all four scoped roles, absent. The two failed ADR scenarios reported cleanup completion, and independent GETs confirmed all ten scenario roots absent. The older local-run DPS remainder was not touched and is not included in these claims.
The manual integration gate and final workflow gate correctly failed. Regular PR CI remains independently green: 79/79 successful checks for this GA PR at
cd9ab501, and 24/24 for #935 atd15a749a. Preview live testing remains pending. No retry broadening, timeout change, production fix, or further dispatch was made in response to this run; full-green qualification remains blocked.Authorized readiness fixes and focused retries: 2026-10-18
The subsequent read-only investigation distinguished two test-side readiness gaps from two instrumented retries. The earlier Hub
400913was decoded from its Activity Log: the selected inbound UAMI was denied four ADR management actions despite an accepted Contributor grant on the exact namespace. That finding supersedes the earlier unexplained-error note; it did not justify a blanket400913retry.The user authorized these test-only changes, now pushed to both GA remotes:
e195cbe7: hand a recognized ADR persisted failure to the existing waited, identity-preserving recovery command using only the remaining helper deadline. Do not replay recovery based on stale GETs; the original 600-second helper budget remains.b190afc0: wait 180 seconds after each newly observed storage role grant, for the exact Hub system principal and UAMI at the exact storage-account scope. Existing grants do not add a wait. Endpoint errors still propagate without replay.52e300ee: move the two query-heavy device/module identity cases into a separate requiredentra-identitiesHubData phase. All four HubData phases retain their existing per-phase bounds, the overall job cap is unchanged, and the complete selection remains 171 cases.11fabc09: account for the two storage fixture waits in that lifecycle's pytest budget:900 + 2 * 180 = 1260seconds, including fixtures. CLI timeouts, phase budgets, command coverage, and all assertions are unchanged.test_register_and_issue_certificate_contract[deadline]52e300eeassignedusing data API2026-11-01; no diagnostic convergence reads were needed.test_iot_storage_endpoint_lifecycle11fabc09TestADRLinkDelete.test_adr_link_hub_dps_delete52e300ee400913did not recur.TestADRLinkLifecycle.test_adr_link_lifecycle52e300eeAdrMiNotAuthorizedafter the waited recovery exhausted its remaining 566 seconds.The first storage retry at
52e300eepassed all six endpoint-property checks but hit the original 900-second whole-test deadline during the final endpoint deletion: setup took 602.13 seconds and the call had used 297.88 seconds. This exposed the missing allowance for the newly added fixture waits. Its failed receipt is preserved; the fresh11fabc09run above verifies the correction.For the remaining ADR failure, the requested outbound UAMI remained persisted, and its exact-scope DPS Contributor grant was accepted at 22:12:41 UTC. The initial namespace PATCH was accepted at 22:12:49, followed by five tracked recovery PATCHes at 22:13:15, 22:14:22, 22:15:59, 22:18:37, and 22:21:15. The final error at 22:22:40 still denied the namespace identity read access to the linked DPS. The initial PATCH correlation is
7271ed0a-9eaa-4158-bf69-c12b65002d33; the last recovery correlation iscf35f4e2-2880-4b1b-8046-c1f4f7dc092d. This demonstrates persistent service authorization rejection within the existing budget, not proof of effective authorization or proof that a longer wait would resolve it. No further production change, broader retry classifier, or ADR timeout increase was made.All attempts used Python 3.10,
centraluseuap, canary ARM, isolated CLI profiles, and committed GA source. Session diagnostics did not alter responses or assertions. The initial four-case cohort has all 41 recorded ARM IDs independently absent; the storage-only retry also has every recorded ID independently absent. Baseline resources were preserved, native cleanup/teardown evidence retained, and temporary profiles removed.Compatible fixes are also pushed to #935, ending at
ac78916f. Preview-specific fresh-grant behavior is preserved; no preview live run was performed. Regular PR CI is green for GA11fabc09and previewac78916f, separately from integration qualification.Current qualification: three of the four focused cases have passed across the two recorded GA commits; this is not full-suite qualification. The remaining ADR authorization failure blocks the planned full GitHub rerun. No full workflow was dispatched after run 39099115825; its 160 passed / 4 failed / 1 interrupted / 6 unstarted accounting remains the latest complete-workflow result. The new HubData partition still requires a full live run.