Repository navigation
[API tests] Adopt shared authentication for remaining general APIs - #11860
Prangshuman Das (t-prda) wants to merge 22 commits into
Conversation
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session:3952f078-a881-4da8-ad96-13b727e48a91
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session:3952f078-a881-4da8-ad96-13b727e48a91
1db3bf5 to
5c21bd3
Compare
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session:3952f078-a881-4da8-ad96-13b727e48a91
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session:3952f078-a881-4da8-ad96-13b727e48a91
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session:3952f078-a881-4da8-ad96-13b727e48a91
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session:3952f078-a881-4da8-ad96-13b727e48a91
Temporarily sequence193 existing methods through DisabledTests selectors:135 APIV1 and58 APIV2. Removed in#11860; no product quarantine or selection logic. AB#646383 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session:3952f078-a881-4da8-ad96-13b727e48a91
Remove the193 temporary Expense-stage selectors. Preserve the complete general uptake source tree exactly. AB#646383 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session:3952f078-a881-4da8-ad96-13b727e48a91
Relocate the same193 temporary method exclusions without changing selection, authentication or tests. Preserve existing manifest order and remove separate stage files. AB#646383 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session:3952f078-a881-4da8-ad96-13b727e48a91
Inherit Expense-first manifest relocation and restore the exact general uptake source tree. Existing general exclusions remain owned by their downstream fixes. AB#646383 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session:3952f078-a881-4da8-ad96-13b727e48a91
|
Issue #11224 is not valid. Please make sure you link an issue that exists, is open and is approved. |
Good Sense Reviewer - Round 5Recommendation: AcceptWhat this PR doesSince round 4, the stack was reshaped above the Expense-first PR. Fourteen inherited Expense and shared-prerequisite paths leave this PR, while all 159 remaining head files are byte-identical to the previously reviewed head. The updated base temporarily excludes 193 API methods; this PR removes 192 of them and intentionally keeps Status of previous suggestionsNo previous suggestions were open. New observations (commits since round 4)None - both review samples found the stack reshaping consistent. The 135 APIV1 temporary exclusions are reduced by 134, all 58 APIV2 temporary exclusions are removed, and no new implementation path was introduced. Risk assessment and necessityRisk: The effective implementation at the head is unchanged for all 159 remaining paths. The current checks show 54 successes and 113 pending jobs; the single failure is issue-link validation rather than an AL correctness failure, so fresh runtime validation remains incomplete. Necessity: The reshaping keeps Expense-first changes in the base and limits this PR to general API authentication uptake. Removing the temporary method exclusions makes the authenticated methods eligible while preserving the independently blocked
|
…cture (microsoft#11891) ## Scope [AB#646383](https://dynamicssmb2.visualstudio.com/Dynamics%20SMB/_workitems/edit/646383) Workflow-only prerequisite above microsoft#11862 and below microsoft#11860: 33 `.github`/`build` files including the committed project finalizer wrappers. - Atomic protected credential-file materialization and cleanup, with cleared temporary buffers and consumers stopped before deletion. - Secondary-tenant Disabled-isolation discovery/restoration and clean-codeunit worker resets. - Clean-codeunit execution is opt-in via `enableCleanTestCodeunitExecution`. This infrastructure stage leaves it absent/off, preserving ordinary typed/Legacy execution and the existing Unit Disabled pass, including warmup and retries. Uptake microsoft#11860 activates it alongside AL authentication adoption. - Existing Legacy lanes, selectors, result aggregation and retry policy remain; Task Scheduler stays limited to the existing Uncategorized profile. - Behavioral PowerShell/ACL coverage of credential lifetime, discovery, scheduling, retries and result merging. All AL source and exclusions equal the integrated main baseline `bb7111877ff786951b86a1a0f80d8b39b8f5dacd`, including merged auth/prerequisites. No provider adoption or API re-enablement belongs here. The old Expense helper remains until uptake. The six relocated source-pattern auth checks are removed here too; the three additional uptake AL source-inspection assertions were also removed. No replacement auth source-pattern checks are added. The previous workflow-only NZ Integration run newly dispatched API Disabled-isolation codeunits before authentication adoption: CU139700 has 22 failures in its JUnit, while unchanged-core NZ has no CU139700 suite and no failures. These are real runtime regressions, not infra failures or tolerated-native evidence. The default-off gate restores the stage boundary; enabled uptake/full behavior remains equivalent to the previous combined implementation. The earlier workflow run succeeded; that evidence is historical after this baseline refresh. Native stack #11893: **microsoft#10085 auth core -> microsoft#11862 URL/fixture prerequisites -> microsoft#11891 workflow infrastructure -> microsoft#11860 AL uptake -> microsoft#11224–microsoft#11230 -> microsoft#11322 -> microsoft#11451–microsoft#11454**. Main-targeted draft microsoft#11892 stays outside grouping. ## Validation limits Historical uptake/full runs verified CU139496 `MicrosoftAuthenticationRespectsServerAuthMode` in the actual UserPassword fixture (**401/200/401**). The Windows **200/200/200** expectations are implemented but **Windows runtime remains unverified**; no foreign local NST was used. Successful GitHub runs do not establish universal native NAV coverage. Excluded PDF cases, country-specific absent/excluded cases and tolerated-native distinctions are not claimed passing. No additional PR was merged or auto-merged during this refresh; validation drafts remain Do Not Merge outside stack #11893. ## Historical targeted country evidence Final workflow NZ Integration artifact at `9269e3df582704881a898e19029308e9296cbbf1` verifies **2,751 test cases, zero failures, and CU139700 absent**. This confirms the default-off gate no longer prematurely runs the API Items codeunit that previously had 22 failures. [Workflow run36157073629](https://github.com/microsoft/BCApps/actions/runs/36157073629) succeeded with all113 test jobs. ## Current checkpoint Head `69df41756d918a516a3c868ca66f45cbfd320428`; captured main `eaddd6b3c518414f372154ea6cedd6c12b287359`. **Validation BLOCKED; no whole-run or all-country green claim.** Current exact-head AL runs: [workflow](https://github.com/microsoft/BCApps/actions/runs/37215976231), [workflow validation](https://github.com/microsoft/BCApps/actions/runs/37215975121), [uptake](https://github.com/microsoft/BCApps/actions/runs/37215975884), [uptake validation](https://github.com/microsoft/BCApps/actions/runs/37215973922), [full](https://github.com/microsoft/BCApps/actions/runs/37215975278). Remaining jobs are not cancelled. Platform `30.0.55429.0` reproducibly throws `AcquireSqlConnectionFromPool` NullReference on the first API GET after tenant reset: uptake IS Integration job111493435528 (`CapabilitiesProjectsEnabledViaAPI`) and full MX Default job111493443618 (`TestGetCurrencyExchangeRates`). Both occur56–64 seconds after tenant3 reset; later independent requests pass, but the failed methods do not recover. No scheduler reset/worker overlap was found. Async runtime/pool lifecycle coupling remains possible, unproven—not infrastructure-only. Exact implementation is unavailable in the exposed NAV tree; runtime-owner source/PDB analysis of pool lifetime across dismount/copy/remount is required. Separately, uptake-validation BE job111494278233 fails ordinary SLS installation with a duplicate datasearch sequence before clean execution. Runner/network outages are separate failures. No AL retries, arbitrary waits or classifier broadening will mask these failures. **Verified partial evidence:** direct uptake CU148343 passes **153/198 cases across17 countries**, including all9 methods and the repaired policy snapshot method. CA/CZ/ES/NL/NO artifacts were missing at2026-10-04T19:58Z; absence is not failure or success. Original8 methods, all assertions, four response clears and five query-safe URLs are preserved alongside upstream's ninth method. Local Pester remains117/117 at workflow/uptake/full. All4 exact-head PowerShell runs passed; workflow-validation37215974877 required attempt2 after one analyzer-tool crash; the other3 passed attempt1. Uptake PowerShell provenance is validation37215973669 at the same uptake SHA, not a separate direct-branch run. The supported finalizer ran after normal teardown in direct workflow BE Default job111495104917 at2026-10-04T19:30:13.2943924Z and direct uptake DE Integration job111493433096 at2026-10-04T19:37:30.6075547Z. These markers prove hook invocation, not explicit deletion when teardown already removed the file. The23 committed wrappers/shared finalizer and absent generator remain unchanged. **Accepted limitation:** explicit cleanup is success-only; failed/cancelled runs rely on normal container teardown, with no hard-runner-loss guarantee. Credential ACL protections remain; per-run disposable CI credentials limit risk, not eliminate it. No CU139496 runtime evidence yet; Legacy1 remains unverified and W1 Default does not cover it. Windows authentication, excluded CompanyInfo (`TestGetCompanyAndEnvironmentDescriptions`, PR11741), Travel, PDF/native coverage remain unverified/excluded as applicable. Existing review fixes/resolutions, native stack #11893, merged prefix, approval/queue/draft states and upstream exclusions remain unchanged. Permission cleanup from PR11561 is retained. No new source change, baseline update, push, merge or AL retry accompanies this checkpoint. Validation drafts remain Do Not Merge. --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 3952f078-a881-4da8-ad96-13b727e48a91
…t#12320) ## What & why `TestGetCompanyAndEnvironmentDescriptions` (CU 139806, added in microsoft#11741) writes Company Information in the test session and then calls `Commit()` before making a web-service GET. Under codeunit test isolation, `Commit()` is rolled back, so the test session keeps its lock on Company Information. The GET then fails with 409 ("record in table 'Company Information' is being updated in a transaction done by another session"). The lock lasts until the end of the codeunit, so the PATCH in `TestModifyCompanyInformation` also gets a 409. Both tests were disabled in NAV during the BCApps uptake. Changes: - `APIV2 - Company Info. E2E`: set `RequiredTestIsolation = Disabled` so `Commit()` takes effect and the web-service session can read and lock the record. `TestGetCompanyAndEnvironmentDescriptions` now restores the original company and environment descriptions after the GET, because nothing rolls them back anymore. - `Environment Information Impl.`: `GetEnvironmentDescription` now uses `if not Get() then exit('')` instead of `GetEnvironmentInformationSafe`, which inserted the singleton record on the read path. API GETs no longer write to `Environment Information`. The return value is unchanged: an empty string when no record exists. The setter and the environment-copy cleanup still use the insert-if-missing helper. The table is `Access = Internal` and only this codeunit uses it. ## Linked work Fixes [AB#652692](https://dynamicssmb2.visualstudio.com/1fcb79e7-ab07-432a-a3c6-6cf5a88ba4a5/_workitems/edit/652692) ## How I validated this - [x] I read the full diff and it contains only changes I intended. - [ ] I built the affected app(s) locally with no new analyzer warnings. - [ ] I ran the change in Business Central and confirmed it behaves as expected. - [x] I added or updated tests for the new behavior, or explained below why none are needed. **What I tested and the outcome** Not built or run locally. CU 139806 is on `_Exclude_APIV2__Tests.DisabledTest.json` in BCApps, so BCApps CI won't run it. It has to be validated in NAV, where the two methods are currently disabled in `App/DisabledTests/APIV2CompanyInfoE2E.DisabledTest.json`. I checked every caller of `GetEnvironmentDescription` in `src`: the Company Information pages in all layers, the APIV2 page, and the tests. All of them use only the returned text. ## Risk & compatibility - Overlaps with microsoft#11860 ([AB#646383](https://dynamicssmb2.visualstudio.com/1fcb79e7-ab07-432a-a3c6-6cf5a88ba4a5/_workitems/edit/646383)), which adds the same `RequiredTestIsolation = Disabled` line to CU 139806. Expect a trivial merge conflict, so the two PRs need coordinating. - Not yet confirmed which test runner NAV uses for the `_Exclude_APIV2_ Tests` app. If NAV already runs it without isolation, the isolation change alone won't fix the 409, and the root cause needs another look. - The NAV disabled-test entries for both methods still need to be removed after this lands. - The `Environment Information` row is now created on the first write instead of the first read. Nothing depends on the row existing. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
…microsoft#12325) ## Scope Related authentication and API enablement: [AB#646383](https://dynamicssmb2.visualstudio.com/Dynamics%20SMB/_workitems/edit/646383) (link only; this PR does not resolve the umbrella item). Fixes [AB#653119](https://dynamicssmb2.visualstudio.com/1fcb79e7-ab07-432a-a3c6-6cf5a88ba4a5/_workitems/edit/653119) Separate test defect: [653119 - Policy snapshot API URL composition and response isolation](https://dynamicssmb2.visualstudio.com/Dynamics%20SMB/_workitems/edit/653119). This tracks the policy-snapshot test corrections, not production access permissions or unrelated runtime failures. Expense-first adoption directly against main after the external squash merge of workflow microsoft#11891; remaining general APIs follow in microsoft#11860. - Migrate the 11 reviewed Expense API/helper paths to shared authentication and remove exactly 51 existing Expense API exclusions. Preserve exactly nine non-API Expense exclusions; all 19 previously retained API exclusions are now removed. - Enable the existing `enableCleanTestCodeunitExecution` boolean. Use existing DisabledTests selectors throughout discovery, ordinary execution and clean-codeunit execution/reruns. No app-name allowlist, new selection setting or runner implementation/test change. - Include the six-line license-safe WorkDate helper needed by PerDiem, five query-safe policy URL compositions, four independent response clears, and the existing unlimited-approval fixture. Preserve all nine Activity Log tests and upstream assertions. - Consolidate microsoft#11453's exact assigned-user filter (no cross-table range compression), true fallback fixture and regressions. Upstream wildcard quoting alone did not fix the range-gap case. - Consolidate microsoft#11451's unique denied-approval error/permission capture and microsoft#11454's existing repeated-delta, missing-header-permission, Released-status and real deletion-total regressions, including its internal test-only permission set. - Do not reintroduce upstream repairs from microsoft#11654 (three permission-role tests and posted zero-amount fixture), the obsolete date test removed by microsoft#12074, or the production indirect-Modify change already supplied by microsoft#11333. microsoft#11452's duplicate deletion helper is absent; existing callers use the upstream shared helper. - All seven artificial Expense exclusions introduced by the previous uptake are absent here and at every general checkpoint. This is not blanket re-enablement of Expense tests. This focused review diff has21 paths, using the two existing API exclusion manifests. No NAV selectors, local NST, BC-ExpenseAgent changes, unrelated new test scope or production permission changes. Exact head: `bd3bbc04e13965f967a26eef435bdbf0cbc09ad7`; tree: `2b8c47b138846f63bd49d47188f54ea7e86c1f24`. ## Expense-first sequencing using existing exclusions The same **193 method-specific temporary exclusions (135 APIV1 +58 APIV2 across12 codeunits)** now live in the existing `src/DisabledTests/_Exclude_APIV1__Tests/_Exclude_APIV1__Tests.DisabledTest.json` and `src/DisabledTests/_Exclude_APIV2__Tests/_Exclude_APIV2__Tests.DisabledTest.json`. No separate sequencing files remain. Original entries retain their order/style/content; no new duplicate or wildcard/codeunit-wide exclusion is introduced. Unrelated pre-existing APIV2 duplicates are preserved rather than mixed with this change. microsoft#11860 removes the temporary additions from these same existing manifests alongside its already-reviewed authentication uptake. All193 temporary stage entries are removed in microsoft#11860, but it makes **192/193 target methods eligible**: the independent `139739::TestDeleteInUse` exclusion remains until the VAT fixture correction in PR [microsoft#11224](microsoft#11224) removes it. From microsoft#11224 onward all193 are eligible; eligibility is not runtime success. All general/downstream cumulative trees are **exactly byte-identical** to the preceding checkpoint; the full checkpoint has none of these193 methods excluded. No app-name allowlist, selection setting, runner/authentication/test/production change or Logiq exclusion is added. **Why these methods started executing:** they already required Disabled isolation and were IntegrationTest codeunits. Ordinary typed selection in TestSuiteMgt332–352 selects None|Codeunit; the old extra Disabled pass in RunTestsInBcContainer was UnitTest-only. The clean-execution switch newly reaches Disabled IntegrationTest codeunits and still honors the existing JSON exclusions. These193 methods were not listed in those exclusions. This is a pre-existing selection gap, not a newly introduced product auth bug or proof they never ran in any historical configuration. A complete67-codeunit audit preserves existing UnitTest/Legacy behavior and the ten independently handled Logiq integration tests. Historical baseline run37215976231 at head69df41756d918a516a3c868ca66f45cbfd320428 independently corroborates this: zero of the exact193 methods appear across five inspected W1 result artifacts containing37,626 testcases (Integration, both Legacy buckets, default/unit and Uncategorized). This evidence is limited to that W1 baseline, not every country or historical run. The completed alternate-path audit found no other ordinary configured baseline BCApps lane: APIV1/APIV2 are outside Legacy buckets, Disabled-unit fallback retains UnitTest filtering, discovery skips test procedures, and ordinary PR/CI/CD/rerun routes do not bypass those constraints. Manual or explicitly untyped execution remains possible; no universal historical or NAV absence is claimed. **Expense scope is unchanged:**51 API reenables, nine non-API exclusions, baseline six cases and all consolidated regressions. The two legacy Spend Requests methods remain conditional on not CLEAN30. Focused microsoft#12325 review:21 files, including the two existing exclusion manifests. General microsoft#11860 review:159 files. The official NAV `Disable-NAVALTest` helper was inspected: it has no destination/app-file parameter, writes NAV's App/DisabledTests using per-codeunit filenames and sorts entries. It cannot safely preserve these BCApps files. A bounded JSON relocation preserved original prefixes/order and checked exact identities, then exercised the unchanged real loader. No new shared helper/framework or NAV selector change was made. ## Validation and presentation evidence **Pester117/117 passed independently at the new Expense/general/full heads.** Actual existing-loader checks confirm identical effective193-method selection after relocation and preserved51/9 Expense scope. All nine downstream Git tree hashes remain exactly unchanged. Fresh exact-head CI is pending; old-head successes are not substituted for current runtime evidence. Historical run37330893173 at head88881be reached193 general methods:171 genuine401 failures and22 nominal passes (17 bare-ASSERTERROR cases can accept the wrong error; five local fixtures). Separately, all51 Expense methods passed in13 inspected countries (663 results), and all63 touched API methods yielded819 results; Activity coverage was117/198 at that checkpoint. These are bounded historical results, not a full/current matrix pass. The preceding stage-fix runs hit50 hosted-runner acquisition cancellations; other jobs were active, so this was not a claimed global outage. New pushes schedule fresh CI, not an AL retry. The general SQL-pool NRE and missing warning-reference artifacts remain separate unresolved limitations. Durable session presentation notes: **api-test-enablement-presentation-notes.md**, with source-pinned selection proof, fix/coverage inventory, helper limitations and historical-vs-current evidence boundaries. Fresh runtime proof must still establish the51 Expense cases and actual193-case suppression at Expense stage. [AB#646383](https://dynamicssmb2.visualstudio.com/1fcb79e7-ab07-432a-a3c6-6cf5a88ba4a5/_workitems/edit/646383) (link only). Native stack #12327 remains microsoft#12325 → microsoft#11860 → microsoft#11224 → microsoft#11225 → microsoft#11226 → microsoft#11227 → microsoft#11228 → microsoft#11229 → microsoft#11230 → microsoft#11322. Protected merged microsoft#10085/microsoft#11862/microsoft#11891 and validation microsoft#11892 are untouched; validation-only microsoft#11861/microsoft#11455 remain Do Not Merge. No new main integration, native-group/base change, PR merge, queue operation, Actions cancellation or manual retry was made. All prior heads remain ancestors; source publication used backups and an atomic forward-only push with explicit leases. Exact current head: `bd3bbc04e13965f967a26eef435bdbf0cbc09ad7`; source tree: `2b8c47b138846f63bd49d47188f54ea7e86c1f24`. --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 3952f078-a881-4da8-ad96-13b727e48a91
Scope
Fixes AB#646383
Remaining general API shared-authentication adoption and reviewed non-Expense re-enablement above Expense-first #12325. This focused review diff has159 paths, removing temporary entries from the existing API exclusion manifests.
Expense authentication, its 51 existing API reenables, preserved nine non-API exclusions, existing clean-execution activation, PerDiem WorkDate prerequisite and consolidated Expense fixes/tests are inherited from #12325, not repeated here. No app-name allowlist or new runner selection logic.
Retain the general APIV1/APIV2/other reviewed caller migrations, license-safe WorkDate usage, Disabled-isolation declarations and exclusion changes. Keep the real HTTP CU139496
MicrosoftAuthenticationRespectsServerAuthModeregression here, alongside the existing shared auth/URL contracts. Its UserPassword path expects 401/200/401; Windows expects 200/200/200. Runtime at this new head is not yet proven.The 47 general fix-owned methods remain downstream in #11224–#11230 and #11322, with each original layer-local patch unchanged. No extra Expense re-enablement is deferred to those PRs.
Exact head:
c4953dceffe02a017adad34973e1955017bf5d20; tree:0c79c4094ea8e54fb61edc325ce8166ec9b07b55.Expense-first sequencing using existing exclusions
The same 193 method-specific temporary exclusions (135 APIV1 +58 APIV2 across12 codeunits) now live in the existing
src/DisabledTests/_Exclude_APIV1__Tests/_Exclude_APIV1__Tests.DisabledTest.jsonandsrc/DisabledTests/_Exclude_APIV2__Tests/_Exclude_APIV2__Tests.DisabledTest.json. No separate sequencing files remain. Original entries retain their order/style/content; no new duplicate or wildcard/codeunit-wide exclusion is introduced. Unrelated pre-existing APIV2 duplicates are preserved rather than mixed with this change.#11860 removes the temporary additions from these same existing manifests alongside its already-reviewed authentication uptake. All193 temporary stage entries are removed in #11860, but it makes 192/193 target methods eligible: the independent
139739::TestDeleteInUseexclusion remains until the VAT fixture fix #11224 removes it. From #11224 onward all193 are eligible; eligibility is not runtime success. All general/downstream cumulative trees are exactly byte-identical to the preceding checkpoint; the full checkpoint has none of these193 methods excluded. No app-name allowlist, selection setting, runner/authentication/test/production change or Logiq exclusion is added.Why these methods started executing: they already required Disabled isolation and were IntegrationTest codeunits. Ordinary typed selection in TestSuiteMgt332–352 selects None|Codeunit; the old extra Disabled pass in RunTestsInBcContainer was UnitTest-only. The clean-execution switch newly reaches Disabled IntegrationTest codeunits and still honors the existing JSON exclusions. These193 methods were not listed in those exclusions. This is a pre-existing selection gap, not a newly introduced product auth bug or proof they never ran in any historical configuration. A complete67-codeunit audit preserves existing UnitTest/Legacy behavior and the ten independently handled Logiq integration tests. Historical baseline run37215976231 at head69df41756d918a516a3c868ca66f45cbfd320428 independently corroborates this: zero of the exact193 methods appear across five inspected W1 result artifacts containing37,626 testcases (Integration, both Legacy buckets, default/unit and Uncategorized). This evidence is limited to that W1 baseline, not every country or historical run. The completed alternate-path audit found no other ordinary configured baseline BCApps lane: APIV1/APIV2 are outside Legacy buckets, Disabled-unit fallback retains UnitTest filtering, discovery skips test procedures, and ordinary PR/CI/CD/rerun routes do not bypass those constraints. Manual or explicitly untyped execution remains possible; no universal historical or NAV absence is claimed.
**Expense scope is unchanged:**51 API reenables, nine non-API exclusions, baseline six cases and all consolidated regressions. The two legacy Spend Requests methods remain conditional on not CLEAN30. Focused #12325 review:21 files, including the two existing exclusion manifests. General #11860 review:159 files.
The official NAV
Disable-NAVALTesthelper was inspected: it has no destination/app-file parameter, writes NAV's App/DisabledTests using per-codeunit filenames and sorts entries. It cannot safely preserve these BCApps files. A bounded JSON relocation preserved original prefixes/order and checked exact identities, then exercised the unchanged real loader. No new shared helper/framework or NAV selector change was made.Validation and presentation evidence
Pester117/117 passed independently at the new Expense/general/full heads. Actual existing-loader checks confirm identical effective193-method selection after relocation and preserved51/9 Expense scope. All nine downstream Git tree hashes remain exactly unchanged. Fresh exact-head CI is pending; old-head successes are not substituted for current runtime evidence.
Historical run37330893173 at head88881be reached193 general methods:171 genuine401 failures and22 nominal passes (17 bare-ASSERTERROR cases can accept the wrong error; five local fixtures). Separately, all51 Expense methods passed in13 inspected countries (663 results), and all63 touched API methods yielded819 results; Activity coverage was117/198 at that checkpoint. These are bounded historical results, not a full/current matrix pass. The preceding stage-fix runs hit50 hosted-runner acquisition cancellations; other jobs were active, so this was not a claimed global outage. New pushes schedule fresh CI, not an AL retry. The general SQL-pool NRE and missing warning-reference artifacts remain separate unresolved limitations.
Durable session presentation notes: api-test-enablement-presentation-notes.md, with source-pinned selection proof, fix/coverage inventory, helper limitations and historical-vs-current evidence boundaries. Fresh runtime proof must still establish the51 Expense cases and actual193-case suppression at Expense stage.
AB#646383 (link only). Native stack #12327 remains #12325 → #11860 → #11224 → #11225 → #11226 → #11227 → #11228 → #11229 → #11230 → #11322. Protected merged #10085/#11862/#11891 and validation #11892 are untouched; validation-only #11861/#11455 remain Do Not Merge. No new main integration, native-group/base change, PR merge, queue operation, Actions cancellation or manual retry was made. All prior heads remain ancestors; source publication used backups and an atomic forward-only push with explicit leases.
Exact current head:
c4953dceffe02a017adad34973e1955017bf5d20; source tree:0c79c4094ea8e54fb61edc325ce8166ec9b07b55.