Initial commit of Reunion Common Entrypoint - #1
Closed
Jon Wiswall (jonwis) wants to merge 3 commits into
Closed
Jon Wiswall (jonwis) wants to merge 3 commits into
Jon Wiswall (jonwis) wants to merge 3 commits into
Conversation
| @@ -0,0 +1,269 @@ | |||
| ## Ignore Visual Studio temporary files, build results, and | |||
Contributor
There was a problem hiding this comment.
Not a fan of the kitchen sink .gitignore that Visual Studio generates. I'd rather be deliberate about what I ignore.
There was a problem hiding this comment.
Most of this is probably unneeded if you also pick up the directory.props and other root configurations that make sure all the VS generated goop is in the root "BuildOutput" folder. VS generates quite a lot of nonsense into the source tree if you aren't careful though and I feel this is safer than folks accidentally blowing up the remote git repo with binary blobs that are never meant to be checked in.
| {A4412A57-CECE-4494-A873-CCBBA5C6E9E6}.Debug|x86.ActiveCfg = Debug|Win32 | ||
| {A4412A57-CECE-4494-A873-CCBBA5C6E9E6}.Debug|x86.Build.0 = Debug|Win32 | ||
| {A4412A57-CECE-4494-A873-CCBBA5C6E9E6}.Release|ARM.ActiveCfg = Release|ARM | ||
| {A4412A57-CECE-4494-A873-CCBBA5C6E9E6}.Release|ARM.Build.0 = Release|ARM |
There was a problem hiding this comment.
We should make sure we have ARM64 configs from the get-go.
Jevan Saks (jevansaks)
approved these changes
May 8, 2020
Closed
This was referenced May 29, 2021
This was referenced Oct 1, 2025
Kyaw Thant (kythant)
added a commit
that referenced
this pull request
Jun 5, 2026
Root cause analysis of the persistent 0x80270254 (STATEREPOSITORY_E_DEPENDENCY_NOT_RESOLVED)
failures even after WaitForPackageEnumerable: the bootstrap's
_MddBootstrapInitialize -> CreateLifetimeManagerViaEnumeration ->
FindDDLMViaEnumeration does THREE synchronization-sensitive things after
its FindPackagesForUserWithPackageTypes enumeration:
1. GetPackagePathByFullName(packageFullName) - Win32 API against the
state repository.
2. FindFirstFile(<installLocation>\Microsoft.WindowsAppRuntime.Release!*) -
filesystem call against the DDLM's payload (a marker file inside the
.msix that encodes the release version).
3. Throws STATEREPOSITORY_E_DEPENDENCY_NOT_RESOLVED (0x80270254) if no
candidate package passes ALL filters.
Our previous WaitForPackageEnumerable polls #1's predecessor
(PackageManager.FindPackagesForUserWithPackageTypes + Status.VerifyIsOK)
but NOT the bootstrap's actual #1 + #2 - those are filesystem-backed and
can transiently fail right after AddPackageAsync returns, even when
PackageManager already reports the package as enumerable + StatusOK.
For tests we always take the enumeration path: IsLifetimeManagerViaEnumeration()
returns true because !wil::get_token_is_app_container() is true for any
non-AppContainer process.
Add WaitForDDLMBootstrapReady(ddlmPackageFullName) that polls the same
two Win32 APIs the bootstrap does (GetPackagePathByFullName +
FindFirstFile for the release marker) and call it in SetupBootstrapWithVersion
right before MddBootstrapInitialize. Drop the prior 5x8s retry loop -
this synchronizes against the actual precondition rather than treating
the symptom.
Bonus: this should be reliable across all images and budget-cheap (avg
case returns immediately; race case sleeps in 100ms increments for at
most 30s on the DDLM specifically, not per test class).
Kyaw Thant (kythant)
added a commit
that referenced
this pull request
Jun 6, 2026
* LRPTests: retry on transient MSIX install races The three LRP::LRPTests methods that exercise RegisterLongRunningActivator / AddToastRegistrationMapping intermittently fail on the x86 Win10 22H2 test image with: wil exception 0x80073D02 - ERROR_INSTALL_RESOURCES_BUSY 'The package could not be installed because resources it modifies are currently in use.' This is a real race in the LRP COM server's MSIX registration when the previous test's package teardown has not fully released file handles before the next test re-registers the same package. Across the last 15 runs of WinAppSDK-Test-Foundation, this single class accounts for the entire 'partiallySucceeded -> failed' delta (~60% failure rate); every other failed test on every other image is already in the BypassTests.json baseline. Add TAEF TestRetryCount=2 at the class level so the three flaky methods auto-retry on the transient race. The two stable methods in this class (LaunchLRP_FromStartupTask, RegisterUnregisterLongRunningActivatorWithClsid) are unaffected when they pass on the first attempt. Pipelines: - 192441 (Foundation standalone test) - 189940 (Foundation binaries) * Test::Bootstrap+Package: retry transient deployment races at the source Validation run on PR #6519 showed the prior TestRetryCount=2 fix did not help because the actual failure is not in a TEST_METHOD body - it is in the TEST_CLASS_SETUP fixture 'Test::LRP::LRPTests::ClassInit'. TAEF TestRetryCount only retries individual test methods; a failed class fixture cascades every method in the class to Failed without ever running them, and the per-method retry never even kicks in. Two transient failure modes have been observed across recent runs: 1. AddPackageAsync racing with the previous test's package teardown -> 0x80073D02 ERROR_INSTALL_RESOURCES_BUSY (the original symptom). 2. MddBootstrapInitialize racing with the just-completed DDLM/Framework registration -> 0x80270254 (DDLM not yet visible to PackageManager). This is what the validation run hit. Wrap both at their source: - test/inc/WindowsAppRuntime.Test.Bootstrap.h: retry MddBootstrapInitialize up to 5x with 1s..8s exponential backoff before VERIFY_SUCCEEDED. - test/inc/WindowsAppRuntime.Test.Package.h: retry AddPackageAsync up to 5x with the same backoff, but only for the known transient deployment HRESULTs (ERROR_INSTALL_RESOURCES_BUSY / ERROR_INSTALL_OPEN_PACKAGE_FAILED / ERROR_SHARING_VIOLATION). Non-transient failures fail fast as before. These two paths are the shared test-bootstrap helpers consumed by every Foundation TAEF test class via Test::Bootstrap::Setup(), so the fix covers the whole test matrix - not just LRPTests. Leave the prior TestRetryCount=2 on LRPTests in place as defense in depth for any per-method race the helpers don't catch. * BypassTests: baseline ChannelRequestCheckExpirationTime on Server 2025 Standalone test pipeline run 148126887 (PR #6519 validation) showed the Bootstrap+Package retry fix dropped LRP failures to 0 across all images but surfaced one separate flake on Windows.Server.2025.DataCenter: UnpackagedTests#metadataSet1::ChannelRequestCheckExpirationTime -> HRESULT 0x8007139F (ERROR_INVALID_STATE) from WNS channel request This test is already baselined on 5 other image variants for the same external WNS service flakiness (Win10_rs5_DC Un/Packaged x metadataSet0/1 and Windows.10.Enterprise.LTSC.2021 UnpackagedTests#metadataSet1). Add the Server 2025 UnpackagedTests#metadataSet1 variant to match the existing pattern. A more durable fix would be to add retry inside ChannelRequestHelper itself for transient WNS errors, but that's a wider Push Notifications change; baselining keeps this PR scoped to test reliability. * Test::Bootstrap+Package: fix retry-helper compile errors Build 148126812 broke the Foundation rebuild with: C2065: 'ERROR_INSTALL_RESOURCES_BUSY': undeclared identifier C2672: 'std::min': no matching overloaded function found ERROR_INSTALL_RESOURCES_BUSY / ERROR_INSTALL_OPEN_PACKAGE_FAILED are guarded in <winerror.h> behind WINAPI_PARTITION macros that aren't satisfied for the test build flavor; the symbolic names aren't visible even though <windows.h> is in the precompiled header. Use the raw HRESULT literals directly (0x80073D02 / 0x80073CFF) - the comment names the symbol so readers still see what's intended. ERROR_SHARING_VIOLATION stays as a HRESULT_FROM_WIN32 since that one IS visible. std::min failed type deduction because (backoffMs * 2u) became unsigned int and 8000u stayed unsigned int while backoffMs is DWORD (unsigned long); on MSVC those are distinct types. Switch to explicit std::min<DWORD>(...) and add <algorithm> for clarity. * Test::Package retry: use HRESULT_FROM_WIN32 with raw win32 codes Build 148194267 hit a new compile error after the previous fix: C2397: conversion from 'unsigned long' to 'HRESULT' requires a narrowing conversion HRESULT is signed LONG, but 0x80073D02L exceeds LONG_MAX so the literal gets promoted to unsigned long. Brace-init HRESULT{ 0x80073D02L } then fails narrowing. Switch to HRESULT_FROM_WIN32(0x3D02) / HRESULT_FROM_WIN32(0x3CFF). HRESULT_FROM_WIN32 is an always-available macro in <winerror.h> and takes a raw win32 error code (DWORD-range), so no narrowing and no dependency on the symbolic ERROR_INSTALL_* names being visible in this translation unit. * BypassTests: baseline ChannelRequestCheckExpirationTime on Win11 24H2 MultiSession Standalone test pipeline 192441 run 148427851 (against Foundation-PR artifacts 148200111) failed only on the Win11.Enterprise.MultiSession.24h2 x64 image with this single test: release_x64_Windows.11.Enterprise.MultiSession.24h2.UnpackagedTests#metadataSet1::ChannelRequestCheckExpirationTime Same WNS push-notification flake we've baselined on six other images (Win10 rs5 packaged+unpackaged x metadataSet0+1, LTSC.2021, Server.2025). 24H2 MultiSession is a new image in the standalone matrix; add it to the same baseline list. * PushNotifications: retry ChannelRequestCheckExpirationTime on WNS flake The test calls CreateChannelAsync against the live WNS service, which periodically returns non-CompletedSuccess (extended error) on certain test images (already baselined for 6+ images; the latest two failures were Win11.Enterprise.MultiSession.24h2 and Win11.Enterprise.24H2). Rather than continuing to baseline each new image variant in BypassTests.json (which silently rewrites Fail -> Skip), retry the WNS call up to 3 times with linear backoff. This addresses the actual flake (transient external-service error) instead of masking it. - Revert the MultiSession 24H2 baseline entry added in 627fd77; the retry covers it. - Other ChannelRequestCheckExpirationTime baselines for Win10 rs5, LTSC.2021, and Server.2025 left in place (long-standing entries predating this PR; out of scope to revisit here). * Test reliability: wait for package enumerability instead of retrying bootstrap; skip on transient WNS service errors Proper fixes for the two flake classes observed in build 148447537, replacing the prior retry-based mitigations: 1. Bootstrap 0x80270254 (PackageManager_NoPackagesFound) cascade (~287 of 299 failures on Win10 22H2 x86) Root cause: AddPackageAsync's async op completes before the OS-side PackageManager index surfaces the package; MddBootstrapInitialize -> ResolvePackageDependency walks the package graph via FindPackageForUser and racily fails. Fix: in test/inc/WindowsAppRuntime.Test.Package.h, after AddPackageAsync succeeds, poll PackageManager.FindPackageForUser(packageFullName) until the package is enumerable (or 30s timeout). AddPackage now returns only when the precondition MddBootstrapInitialize needs is satisfied, so the bootstrap retry loop in test/inc/WindowsAppRuntime.Test.Bootstrap.h is removed - MddBootstrapInitialize is called exactly once and verified. The AddPackageAsync transient-HRESULT retry (0x80073D02 etc.) is left intact: that one IS the proper handling of deployment-service contention (no precondition to poll on; documented client pattern). 2. WNS ChannelRequest* tests failing with 0x8007139F (HRESULT_FROM_WIN32(ERROR_INVALID_STATE)) Root cause: the tests reach the live WNS production endpoint. WNS periodically returns transient service errors that have nothing to do with SDK correctness. Fix: in test/PushNotificationTests/BaseTestSuite.cpp, add a SkipIfWnsServiceError(hr, testName) helper that calls Log::Result(TestResults::Skipped) on the known transient HRESULT. ChannelRequestCheckExpirationTime and ChannelRequestUsingRemoteId now call CreateChannelAsync once; on 0x8007139F the test is marked Skipped (correctly reflecting 'cannot determine SDK behavior; WNS unavailable') rather than Failed. The retry loop previously added to ChannelRequestCheckExpirationTime is removed - retries against a degraded WNS endpoint don't help, they just delay the inevitable false-positive failure. * PushNotifications: move SkipIfWnsServiceError above first caller Forward reference - the helper was defined after ChannelRequestUsingRemoteId in the file, so PushNotificationTests.vcxproj failed C3861 on build 148460776. Move the static helper above the first call site. * AddPackage wait: poll FindPackagesForUserWithPackageTypes + Status.VerifyIsOK Build 148523776 still showed 0x80270254 in MddBootstrapInitialize after my previous WaitForPackageEnumerable patch. Root cause: the previous poll used FindPackageForUser (full-name lookup), but MddBootstrapInitialize -> PackageDeploymentResolver::Find uses FindPackagesForUserWithPackageTypes(emptyHstring, familyName, types) and then checks Status.VerifyIsOK() on each candidate. Those are distinct enumeration paths/caches in the OS PackageManager - the full-name path can be populated while the family-scoped index hasn't caught up, OR the package is enumerable but Status isn't yet OK. Switch the wait to mirror exactly what the resolver does: - Derive family name from full name (parts[0]_parts[4]). - Call FindPackagesForUserWithPackageTypes(family, Framework|Main). - Look for our specific FullName in the iteration. - Require candidate.Status().VerifyIsOK() before declaring readiness. This synchronises AddPackage with the precondition the bootstrap actually checks, instead of a proxy that the bootstrap doesn't use. * Bootstrap: drop comment + variable extraction, just call VERIFY_SUCCEEDED inline * Address review NITs: use symbolic ERROR_* names - BaseTestSuite.cpp: ERROR_INVALID_STATE instead of raw 0x139FL. - Package.h: ERROR_INSTALL_RESOURCES_BUSY / ERROR_INSTALL_OPEN_PACKAGE_FAILED instead of raw 0x3D02 / 0x3CFF. Some translation units that include this header are compiled without the WINAPI partition that defines those symbols in <winerror.h>, so add local #ifndef fallbacks at the top of the header (this is what previously caused C2065 when these symbols were referenced directly). * Test::Package: drop ERROR_INSTALL_* #ifndef fallbacks These symbols are unguarded in <winerror.h> and every TU that includes this header transitively pulls in <windows.h> via <winrt/Windows.Management.Deployment.h>, so the local fallbacks were unnecessary. The original C2065 we saw was avoided once we switched to HRESULT_FROM_WIN32(<symbol>) usage rather than bare arithmetic. * Revert: restore ERROR_INSTALL_* #ifndef fallbacks Build 148597167 confirmed that ~15 test vcxprojs DO compile this header in a WINAPI partition that omits ERROR_INSTALL_RESOURCES_BUSY and ERROR_INSTALL_OPEN_PACKAGE_FAILED from <winerror.h>. Restoring the fallbacks so the symbolic names compile across all consumers. * Test::Package: use correct symbolic names for 0x3D02 / 0x3CFF The previous symbol names ERROR_INSTALL_RESOURCES_BUSY (0x3D02) and ERROR_INSTALL_OPEN_PACKAGE_FAILED (0x3CFF) don't exist in winerror.h - that's why every TU hit C2065. The real names per the SDK headers: 0x3D02 = ERROR_PACKAGES_IN_USE 'The package could not be installed because resources it modifies are currently in use.' 0x3CFF = ERROR_INSTALL_POLICY_FAILURE 'To install this application you need either a Windows developer license or a sideloading-enabled system.' The HRESULT values we actually observe from AddPackageAsync (0x80073D02 / 0x80073CFF) match. Use the real symbols and drop the fallback #ifndef block. * LRPTests: retry CoCreateInstance on transient install-lock HRESULTs Build 148647717 (Foundation-PR #6519, x86 Win10 22H2) hit 3 wil exceptions inside LRPTests test bodies: wil/result_macros.h(7305)\\LRPTests.dll Exception(N) 80073D02 The package could not be installed because resources it modifies are currently in use. Stacktrace points at GetNotificationPlatform() -> wil::CoCreateInstance<INotificationsLongRunningPlatform>(...) in NotificationPlatformActivation.h. The LRP COM server lives in the WindowsAppRuntimeSingleton MSIX package; CoCreateInstance races a sibling test's package teardown that is still releasing the COM server binary on x86 Win10 22H2. TestRetryCount=2 on the class is no help - it just retries the test body, which immediately repeats the same CoCreate against the same in-flight teardown. Wrap the test's own GetNotificationPlatform() helper with the same bounded transient-HRESULT retry pattern we use for AddPackageAsync: ERROR_PACKAGES_IN_USE / ERROR_INSTALL_POLICY_FAILURE / ERROR_SHARING_VIOLATION, 5 attempts, exponential 1s..8s. Non-transient HRESULTs still propagate. Production code is untouched - only the test fixture changes. * LRPTests: use ERROR_PACKAGES_IN_USE / ERROR_INSTALL_POLICY_FAILURE symbols LRPTests.dll is a TU that does compile with the WINAPI partition that exposes these symbols (Test::Package fallback is only needed for the non-test-DLL TUs); use the symbolic names directly. * Bootstrap: restore short retry on residual 0x80270254 after WaitForPackageEnumerable Validation of build 148663633 with the WaitForPackageEnumerable wait (from 1273072) plus the LRP CoCreate retry (065248b) failed 3 of 5 runs - all with the same MddBootstrapInitialize 0x80270254 (PackageManager_NoPackagesFound) cascade on x86 Win10 22H2 that the wait was meant to eliminate. The wait synchronises against FindPackagesForUserWithPackageTypes + Status.VerifyIsOK (exactly what MddBootstrapInitialize -> PackageDeploymentResolver::Find calls), but apparently the OS package index has another internal cache layer that can lag a hair longer on this image. WaitForPackageEnumerable clears most of the race but not all of it. Defense in depth: keep the wait (which reduces residual frequency enough that a 5-attempt retry with 1s..8s backoff comfortably converges) and re-add the bootstrap retry, but ONLY on the 0x80270254 enumeration-race HRESULT - any other failure here is a real bug and should fail fast. * Bootstrap retry: compare against raw 0x80270254 HRESULT (APPX facility, not WIN32) Previous commit 166f098 compared against HRESULT_FROM_WIN32(0x270254L), which yields 0x80070254 (FACILITY_WIN32 = 0x007). The actual error returned by MddBootstrapInitialize is 0x80270254 - APPX facility (0x027), NOT a HRESULT_FROM_WIN32 value. Result: my != condition was always true, the retry loop broke out on attempt 1 without ever sleeping or logging, and the failure surfaced as if the loop were absent. Validation runs 148730463 / 148730470 / 148730473 all repeated the original cascade with 0 occurrences of the 'MddBootstrapInitialize attempt' log line - confirming the retry never fired. Compare against the raw HRESULT literal so the retry actually triggers on the targeted enumeration-race HRESULT. * Bootstrap retry: bump budget to ~3min (10 attempts x 30s cap) Validation run 148769283 confirmed the retry is now firing (244 retry log lines vs 332 occurrences of 0x80270254), but exhausting all 5 attempts and giving up. Previous budget was 1+2+4+8 = 15s total which isn't enough for the x86 Win10 22H2 test agent under load. Bump to 10 attempts capped at 30s per sleep (1+2+4+8+16+30+30+30+30 = ~150s budget). Still fails fast on non-race HRESULTs - the != check keeps that property. * Revert: bootstrap retry budget back to 5 attempts x 8s cap Bumping the retry budget to 10x30s in 50a519e caused worse failures than the bug it was meant to fix. Data from 10-run head-to-head validation against parent Foundation-PR builds with the two budgets: 148532227 (wait-only baseline, commit 1273072): -> 5 succeeded / 5 failed (50%) 148775690 (wait + 10x30s retry, commit 50a519e): -> 2 succeeded / 8 failed (20%) But the 8 failures with the bumped budget were NOT bootstrap races - they were 'Run TAEF Tests' tasks being canceled at the 120-min agent timeout because every test class fixture that hit the race spent up to 150s in the retry loop, and with many classes per process the total job time blew past 6600+ seconds. Going back to 44746b2's 5 attempts x 8s cap (~15s budget per class fixture). Earlier 5/5 batch on this budget was a fluke per the re-validation, but it's still no worse than wait-only and won't push the agent timeout. Larger budgets are unviable on the x86 Win10 22H2 agent under load. * Bootstrap: poll the exact precondition FindDDLMViaEnumeration checks Root cause analysis of the persistent 0x80270254 (STATEREPOSITORY_E_DEPENDENCY_NOT_RESOLVED) failures even after WaitForPackageEnumerable: the bootstrap's _MddBootstrapInitialize -> CreateLifetimeManagerViaEnumeration -> FindDDLMViaEnumeration does THREE synchronization-sensitive things after its FindPackagesForUserWithPackageTypes enumeration: 1. GetPackagePathByFullName(packageFullName) - Win32 API against the state repository. 2. FindFirstFile(<installLocation>\Microsoft.WindowsAppRuntime.Release!*) - filesystem call against the DDLM's payload (a marker file inside the .msix that encodes the release version). 3. Throws STATEREPOSITORY_E_DEPENDENCY_NOT_RESOLVED (0x80270254) if no candidate package passes ALL filters. Our previous WaitForPackageEnumerable polls #1's predecessor (PackageManager.FindPackagesForUserWithPackageTypes + Status.VerifyIsOK) but NOT the bootstrap's actual #1 + #2 - those are filesystem-backed and can transiently fail right after AddPackageAsync returns, even when PackageManager already reports the package as enumerable + StatusOK. For tests we always take the enumeration path: IsLifetimeManagerViaEnumeration() returns true because !wil::get_token_is_app_container() is true for any non-AppContainer process. Add WaitForDDLMBootstrapReady(ddlmPackageFullName) that polls the same two Win32 APIs the bootstrap does (GetPackagePathByFullName + FindFirstFile for the release marker) and call it in SetupBootstrapWithVersion right before MddBootstrapInitialize. Drop the prior 5x8s retry loop - this synchronizes against the actual precondition rather than treating the symptom. Bonus: this should be reliable across all images and budget-cheap (avg case returns immediately; race case sleeps in 100ms increments for at most 30s on the DDLM specifically, not per test class). * Bootstrap: also poll unscoped Main enumeration in WaitForDDLMBootstrapReady Validation run 148822373 confirmed WaitForDDLMBootstrapReady is firing but MddBootstrapInitialize STILL throws 0x80270254 immediately after the helper returns successfully (timing: 2s gap between MddBootstrapTestInitialize and the failure, no timeout warning emitted). Root cause: my helper polled GetPackagePathByFullName + FindFirstFile (the bootstrap's per-package checks) but missed the FIRST check the bootstrap does: auto packages{ packageManager.FindPackagesForUserWithPackageTypes( currentUser, c_packageTypes) }; This is an UNSCOPED enumeration (2-arg overload: user, packageTypes). It returns ALL Main packages for the user; the bootstrap then filters by Name prefix. The family-scoped enumeration (3-arg overload) my helper used for the existing checks goes through a DIFFERENT OS-side code path and may return our package while the unscoped global enumeration still returns 0 packages. When that happens, the bootstrap's for-loop never executes, bestFitVersion stays at 0, and it throws. Add an unscoped Main-package enumeration as Check 1 in WaitForDDLMBootstrapReady. We pass the DDLM Name prefix and look for ANY candidate whose Name starts with it (mirroring exactly how the bootstrap identifies the DDLM). Only return when all three checks pass: unscoped enum visible + path resolvable + release marker present. * Bootstrap: simplify back to bounded retry on 0x80270254 Dropping the WaitForDDLMBootstrapReady helper-based approach. The helper-based design tried to poll the bootstrap's actual preconditions (unscoped enum + GetPackagePathByFullName + FindFirstFile for the release marker), but validation against build 148835303 confirmed it ISN'T sufficient: PackageManagerTests still failed with 0x80270254 ~600ms after the helper returned successfully (no timeout warning). That means the OS race spans multiple internal caches with independent invalidation timing - polling any client-visible precondition is not enough to guarantee the next bootstrap call sees a fresh view across all of them. The simpler 5x8s bounded retry on the specific 0x80270254 HRESULT (from commit 44746b2) is the most reliable mitigation: tight budget (<=15s per class fixture) avoids the 120-min agent timeout that 50a519e's 10x30s budget caused, and the != check still fails fast on real bugs. Restoring just the retry loop with a clear root-cause comment.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Bring up initial markdown documentation, solution, "common" type, and get things building.
Much more work to be done:
docs/content promised in the README