Skip to content

Audit ChangeNotifications shared directives for v3 - #3845

Open
Ramses Sanchez-Hernandez (ramsessanchez) wants to merge 15 commits into
powershell-v3from
ramsessanchez-changenotifications-v3-migration
Open

Ramses Sanchez-Hernandez (ramsessanchez) wants to merge 15 commits into
powershell-v3from
ramsessanchez-changenotifications-v3-migration

Conversation

@ramsessanchez

@ramsessanchez Ramses Sanchez-Hernandez (ramsessanchez) commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

No linked issue; this is the existing ChangeNotifications migration PR, finally revalidated after the normal #3886 merge.

Changes proposed in this pull request

  • Preserve the shared-only audit: zero shared cmdlet directives, empty reviewed mappings, no artificial overrides or groups, and unchanged original shared AutoRest require/placeholder intent. Both compatible profiles remain supported; no profile is excluded.
  • Ignore src/readme.graph.md and every profile-local directive. Parameter aliases/transforms and schema/response directives remain deferred classes; none are present in this shared source. Preserve existing naming, finite operation evidence, unaffected neighbors and historical generated boundaries.
  • Integrate actual powershell-v3 target 6475f3f normally. Add module-specific positive PATCH regressions and docs for the new contract, then fully regenerate v1.0 followed by beta. No global framework/Auth/template edits, optional-query sweep, Fix Kiota PostPath typed navigation without renaming operation types #3881 overlay, or extra readback switch.

Current head and preserved history

Current pushed head: 8100cbd, same PR and branch, preserving prior head 9ed2a18c6a1f5c856b7c20718ebc030626fa5be6 and every original migration/profile commit.

  1. 75b44954bb9515adc5f363401d2961fbd9e412f8 - normal target merge.
  2. ed3208464347214feb8a2d63fc96dca077114e13 - own Subscription PATCH single-operation tests and documentation.
  3. 87c491d84bfd47fa90e6810f0b80af27f682562c - separate combined v1.0 full client/cmdlet generation boundary.
  4. 8100cbd6450ef3fd967e5d790d489281bdbf2335 - separate combined beta full generation boundary.

No rebase, amend, force push, new PR, PR merge or protection bypass. Full Git scope, including added/deleted/renamed paths, was inspected rather than relying on a capped REST file list; all paths are ChangeNotifications-owned source/generated output or its test file. No bin/obj, packages, DLLs, logs or proof artifacts are committed.

Profile Compatible operations Exact compatible spec Git blob Tracked output
v1.0 7 e53bd7d80255a87fe5c11b94c5d1f09e15adc854 wrapper/v1.0
beta 7 14bf6c727c87c5433274bfec78a4a681169e5390 wrapper/Beta

Specs, Kiota client source, lock files, wrapper projects, public export names and seven unique routes reproduce unchanged from the prior head. Each generated profile removes the implicit PATCH GET readback; three GET files also receive a generator-produced blank line. The unchanged client/project/lock output was actually regenerated, not skipped or hand-edited. Existing beta casing and beta naming remain.

Positive PATCH contract, not a relabeled old failure

The old PATCH-204 generic-header-loss-on-implicit-GET result in ChangeNotifications-844672-wave3 is user-superseded historical evidence, not a current waived failure. This new target removes the implicit GET entirely:

  • 204: exactly one PATCH, success, no returned object, no GET, even while the test endpoint rejects GET with 403.
  • 200 with model: exactly one PATCH, the actual typed Subscription response (patch-response-id / actual-patch-response), no GET.
  • A caller-explicit Get-MgSubscription independently owns its headers, query, result and error: an explicit GET is separately rejected with 403, then an explicitly requested GET with its own $select and header succeeds.

Own generation tests exercise the real compatible Subscription specs in both profiles with derived data enabled and disabled. PATCH has no native query inputs in either compatible spec. Compiled surfaces have zero mandatory Query inputs; no GET-only Property/Top inputs or PassThru/ReadBack/Refetch switch were added to Update. The real current method surfaces, not invented required queries or mutations, determine coverage.

Full generation and actual test results

pwsh -NoProfile -NonInteractive -File 'C:\Users\ramsess\.copilot\session-state\871a5292-dc5b-423e-8083-5165b0006603\files\Invoke-QueuedModuleBuild.ps1' -RepoRoot 'C:\Users\ramsess\Repos\copilot-worktrees\msgraph-sdk-powershell\ramsessanchez-expert-fortnight' -Module ChangeNotifications -ApiVersion v1.0 -Configuration Release
pwsh -NoProfile -NonInteractive -File 'C:\Users\ramsess\.copilot\session-state\871a5292-dc5b-423e-8083-5165b0006603\files\Invoke-QueuedModuleBuild.ps1' -RepoRoot 'C:\Users\ramsess\Repos\copilot-worktrees\msgraph-sdk-powershell\ramsessanchez-expert-fortnight' -Module ChangeNotifications -ApiVersion beta -Configuration Release

Both actual full four-mutex queued runs used Kiota 1.36.1+fd3bf87790149b87f40f7eae1a5feb9016625943, process-local parallelism 1, normal accepted Authentication 2.41.2, and only openApiDocs_KiotaCompat. No SkipKiota, GenerateOnly, NoCollisionData or fallback input. Slots released automatically. Queue wait time is recorded separately from per-module build seconds.

Profile Full exit / status Module build seconds Fresh normal exports Exact unique routes
v1.0 0 / OK 82.5 8 7
beta 0 / OK 135.2 8 7

Additional non-incremental compile commands, both exit 0:

dotnet build .\src\ChangeNotifications\wrapper\v1.0\Microsoft.Graph.Wrapper.ChangeNotifications.csproj --no-incremental --no-restore -c Release --nologo -v minimal
dotnet build .\src\ChangeNotifications\wrapper\Beta\Microsoft.Graph.Wrapper.ChangeNotifications.csproj --no-incremental --no-restore -c Release --nologo -v minimal
dotnet test .\tools\WrapperGenerator.Tests\WrapperGenerator.Tests.csproj --no-restore --filter 'FullyQualifiedName~ChangeNotificationsDirectiveMigrationTests|FullyQualifiedName~CmdletConfiguratorTests|FullyQualifiedName~NamingTests|FullyQualifiedName~RequiredQueryTests' --logger 'trx;LogFileName=targeted.trx' --results-directory 'C:\Users\ramsess\.copilot\session-state\e2aeb9b2-b451-410c-a8d2-6d243a978c2f\files\post3886-6475-final' --verbosity minimal
.\tools\Get-WrapperDirectiveMigrationInventory.ps1 -Module ChangeNotifications -FailOnUnresolved

Actual TRX: 161 total/executed/passed, 0 failed/not-executed, exit 0. Ordinary strict shared inventory: zero rows/mapped/deferred/unresolved, exit 0. The isolation addendum did not trigger a completed source/full-generation/TRX rerun.

Actual normal transport and post-import memory isolation

Fresh normal-manifest probe commands, all exit 0 / PASS:

pwsh -NoProfile -NonInteractive -File 'C:\Users\ramsess\.copilot\session-state\e2aeb9b2-b451-410c-a8d2-6d243a978c2f\files\post3886-6475-final\Test-SubscriptionFinal.ps1' -Profile v1.0 -Environment Global
pwsh -NoProfile -NonInteractive -File 'C:\Users\ramsess\.copilot\session-state\e2aeb9b2-b451-410c-a8d2-6d243a978c2f\files\post3886-6475-final\Test-SubscriptionFinal.ps1' -Profile v1.0 -Environment USGov
pwsh -NoProfile -NonInteractive -File 'C:\Users\ramsess\.copilot\session-state\e2aeb9b2-b451-410c-a8d2-6d243a978c2f\files\post3886-6475-final\Test-SubscriptionFinal.ps1' -Profile beta -Environment Global
pwsh -NoProfile -NonInteractive -File 'C:\Users\ramsess\.copilot\session-state\e2aeb9b2-b451-410c-a8d2-6d243a978c2f\files\post3886-6475-final\Test-SubscriptionFinal.ps1' -Profile beta -Environment USGov

Each row captures 13 authenticated offline HTTP requests, 4 genuine declined Confirm prompts, 0 live requests, and verifies 8 exports / all 7 unique GraphRoutes. Coverage includes ordinary List default and mandatory item identity, typed GET/list/VAPID outputs, optional query/header binding, typed JSON POST/PATCH bodies/results, bodyless DELETE with If-Match and reauthorize, zero HTTP for WhatIf/declines/invalid Top, positive PATCH204/200 above, independent GET, request-context/reconnect invalidation, disconnect and normal Auth/Kiota assembly contexts.

The actual GraphHttpClientFactory token pipeline, existing in-memory helper and test-only terminal handler are used, not a bare marker client. Beta requests send /beta on the correct Global/USGov host even though the factory client defaults to https://graph.microsoft.com/v1.0/; the shared BaseAddress is not mutated.

The first final probe incorporated the runtime isolation addendum before any final transport run. All additional runspace imports happen before Connect; Set-MgTestDataStore is reapplied after the last import. Actual reflected shared datastore type is recorded as Microsoft.Graph.Authentication.Test.Mocks.MockDataStore in 14 guard checkpoints per row, including before initial Connect, mutation/confirmation work, context changes, reconnect and logout. The terminal checks and records that actual type before every one of the 13 HTTP requests. The pre-reapply DiskDataStore type is separately recorded, not asserted to prove credential I/O. No old runtime report was overwritten or relabeled.

Accepted packaging and dependency ownership

The complete 64-file accepted adapted Authentication 2.41.2 manifest and physical package SHA256 2FC09BFE6B70D313BC56DF8ADCCFB1976FB4E90A1898BF8A916B4B8B792898EB were verified. The exact normal local package root leads process-local PSModulePath:

C:\Users\ramsess\.copilot\session-state\4aa86cf9-d43c-4d2b-a4a3-aeaed01b8f29\files\authentication-v2-sync\final-source\modules

Both normal wrapper manifests require Auth 2.41.2 with no RequiredAssemblies/NestedModules preloads; each fresh bin/package has only the client/runtime/module DLLs. Authentication owns the single normal Kiota/RMS/UriTemplate closure. No old2.38, stock package, shims, manual dependency copies or global setup changes.

After the full builds, supplemental dotnet pack --no-build --no-restore used the same normal generated manifest/version and production nuspec metadata/file/dependency layout. The artifact script only packages completed outputs and verifies that bin hashes are unchanged:

pwsh -NoProfile -NonInteractive -File 'C:\Users\ramsess\.copilot\session-state\e2aeb9b2-b451-410c-a8d2-6d243a978c2f\files\post3886-6475-final\Pack-CompletedProfile.ps1' -Profile v1.0
pwsh -NoProfile -NonInteractive -File 'C:\Users\ramsess\.copilot\session-state\e2aeb9b2-b451-410c-a8d2-6d243a978c2f\files\post3886-6475-final\Pack-CompletedProfile.ps1' -Profile beta

Both exit 0, normal 3-DLL package/build identity checks pass. These are supplemental packaging commands, not substitutes for full Kiota builds.

Honest retained limits

pwsh -NoProfile -NonInteractive -File .\tools\Compare-WrapperCmdletNames.ps1 -GeneratedPath .\src\ChangeNotifications\wrapper\v1.0\Cmdlets -OutLedger 'C:\Users\ramsess\.copilot\session-state\e2aeb9b2-b451-410c-a8d2-6d243a978c2f\files\post3886-6475-final\parity-v1.0.csv'
pwsh -NoProfile -NonInteractive -File .\tools\Compare-WrapperCmdletNames.ps1 -GeneratedPath .\src\ChangeNotifications\wrapper\Beta\Cmdlets -OutLedger 'C:\Users\ramsess\.copilot\session-state\e2aeb9b2-b451-410c-a8d2-6d243a978c2f\files\post3886-6475-final\parity-beta.csv'

Raw oracle parity remains exit 1, unnormalized: v1.0 7/8 (frozen oracle lacks VAPID), beta 0/8 (existing MgBeta prefix and reauthorize/VAPID noun differences). These naming limits were not broadened into a global fix. Existing Microsoft.OpenApi.YamlReader 3.7.0 NU1903 warning remains. Acceptance is PS7/Core only and offline, not live API/tenant certification.

Canonical current evidence is in post3886-6475-final\handoff.json, with raw full-profile logs, per-command exits, actual TRX/scalar counters, strict inventory, four compiled transport captures, post-import datastore checks, source/spec/Auth64/assembly/manifest/package/queue/tool hashes, and complete Git scope. Earlier 08/844672 target and failed probe evidence remains historical and untouched.

Other links

Record an empty reviewed mapping ledger with exact v1.0 and beta compatible operation evidence, and pin unaffected structural and data-aware naming without adding overrides.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Run full compatible-spec Kiota 1.36.1 and wrapper Release generation/build. Client sources, cmdlets and projects are byte-identical; the client lock records the new Kiota version. Build and compiled discovery succeed with 7 exports, and all 6 operations match the published names.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Run full compatible-spec Kiota 1.36.1 and wrapper Release generation/build. Generated sources and projects remain byte-identical; locks record the current Kiota version and exact lowercase beta spec path while preserving tracked wrapper/Beta casing. Compiled discovery succeeds with 8 exports and the operation inventory remains unchanged.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Keep runtime profiles separate from shared GeneratorConfig in naming and suppression regressions, with derived data enabled and disabled. Refresh exact compatible operation IDs/spec hashes and cover the current v1.0 VAPID route. Combined module, configurator and naming tests: 89 passed; strict zero-directive inventory passed.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Run the shared queued full Kiota and wrapper Release pipeline on target 08e409a: exit 0, Status OK, 78.5 seconds, eight fresh compiled exports. Capture current-spec VAPID client and cmdlet plus three Web Push model/expanded-body fields; retain every existing route. Fresh exact GraphRoute, List/Get default, credential-free reads and mutation WhatIf/Confirm checks pass.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Run the shared queued full Kiota and wrapper Release pipeline on target 08e409a: exit 0, Status OK, 111.6 seconds, eight fresh compiled exports. Client/cmdlet source and projects are byte-identical; the client lock records the current compatible description hash. Exact GraphRoute coverage of all seven operations, unchanged inventory, dispatcher defaults, credential-free reads and mutation WhatIf/Confirm checks pass. Preserve wrapper/Beta casing and existing beta naming.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Full shared-queue Release generation on target844672: exit0/OK, 19.5s, eight normal-manifest exports. Regenerate client, cmdlets, project and manifest; generated callers now use explicit v1.0 transport and module bin retains only three owned DLLs. Real Authentication factory typed CRUD/default/query/context and safety probes pass in Global/USGov. Preserve the observed shared PATCH204 generic-header-refetch limitation; no overlay or global fix.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Full shared-queue Release generation on target844672: exit0/OK, 27s, eight normal-manifest exports. Regenerate client, cmdlets, project and manifest; emitted calls explicitly retain beta service root, three-own-DLL packaging and full accepted Authentication ownership. Normal real-factory compiled/package typed CRUD/default/query/context and safety probes pass in Global/USGov; preserve failed shared PATCH204 generic-header-refetch replay without overlays.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…tion

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Add module-specific generation regressions for both profiles with derived data on/off: PATCH emits one mutation, no readback, only native inputs, and returns only a non-null response model. Document caller-explicit GET semantics. Combined module/configurator/naming/required-query tests: 161 passed; shared strict audit remains empty.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Full queued Kiota/client/cmdlet/project/manifest Release run on6475: exit0/OK,82.5s,8exports; no-incremental compile passed. Typed real-factory Global/USGov offline gates positively assert PATCH204 onePATCH/noobject/noGET even withGET403, PATCH200 actualmodel onePATCH, independent callerGET, binder/ShouldProcess/query/profile/Auth contexts. Actual MockDataStore reapplied after all runspace imports and guarded before transport/lifecycle. Clients/projects/locks reproduce unchanged; generated PATCH readback removed.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Full queued Kiota/client/cmdlet/project/manifest Release run on6475: exit0/OK,135.2s,8exports; no-incremental compile passed. Typed real-factory Global/USGov gates assert PATCH204 onePATCH/noobject/noGET even withGET403, PATCH200 actualmodel onePATCH, independent callerGET, binder/ShouldProcess/query/beta-profile/Auth contexts. Actual MockDataStore guarded after all imports beforeConnect/everyHTTP/lifecycle. Clients/projects/locks unchanged; generated PATCH readback removed; preserve Beta casing.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

This branch has not been deployed

No deployments
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