diff --git a/.github/actions/spelling/allow/allow.txt b/.github/actions/spelling/allow/allow.txt
index b347ec85b90..a99422e8b0b 100644
--- a/.github/actions/spelling/allow/allow.txt
+++ b/.github/actions/spelling/allow/allow.txt
@@ -11,17 +11,11 @@ colorbrewer
 commandlines
 consvc
 copyable
-CText
-dalet
 dcs
 deselection
-dialytika
 diffing
 Dimidium
-dje
 downsides
-dze
-dzhe
 Emacspeak
 Fitt
 flac
@@ -29,16 +23,13 @@ FTCS
 gantt
 gfm
 ghe
-gje
 godbolt
 hstrings
 hyperlinking
 hyperlinks
 Kbds
-kje
 libfuzzer
 liga
-lje
 Llast
 Lmid
 locl
@@ -50,10 +41,8 @@ minimalistic
 mkmk
 mnt
 mru
-nje
 notwrapped
 NTMTo
-ogonek
 overlined
 perlw
 postmodern
@@ -75,18 +64,13 @@ rlig
 rubyw
 runtimes
 servicebus
-shcha
-similaritytolerance
 slnt
 stakeholders
 subpage
 sustainability
 sxn
 Tencent
-TLDR
-tonos
 toolset
-tshe
 UEFI
 uiatextrange
 und
@@ -94,8 +78,5 @@ vsdevcmd
 westus
 workarounds
 WSLs
-wtconfig
 XBox
 YBox
-yeru
-zhe
diff --git a/.github/actions/spelling/allow/apis.txt b/.github/actions/spelling/allow/apis.txt
index 66709095872..336e62ff2a7 100644
--- a/.github/actions/spelling/allow/apis.txt
+++ b/.github/actions/spelling/allow/apis.txt
@@ -2,11 +2,8 @@ aalt
 abvm
 ACCEPTFILES
 ACCESSDENIED
-acl
-aclapi
 alignas
 alignof
-allocconsolewithoptions
 APPLYTOSUBMENUS
 appxrecipe
 bitfield
@@ -15,29 +12,20 @@ BUILDBRANCH
 BUILDMSG
 BUILDNUMBER
 BYCOMMAND
-BYPOSITION
 charconv
-CLASSNOTAVAILABLE
 CLOSEAPP
 cmdletbinding
-COLORPROPERTY
 colspan
 COMDLG
 commandlinetoargv
-commoncontrols
-comparand
 COPYFROMRESOURCE
 cstdint
 CXICON
 CYICON
-Dacl
 dataobject
-dcomp
 debugbreak
 delayimp
-DERR
 dlldata
-DNE
 dnom
 DONTADDTORECENT
 DWMSBT
@@ -64,81 +52,42 @@ GETHIGHCONTRAST
 GETMOUSEHOVERTIME
 GETTEXTLENGTH
 HARDBREAKS
-Hashtable
 HIGHCONTRASTON
 HIGHCONTRASTW
 HIGHQUALITYSCALE
 hinternet
-HINTERNET
 hotkeys
 href
 hrgn
 HTCLOSE
 hwinsta
-HWINSTA
-IActivation
-IApp
 IAppearance
-IAsync
-IBind
-IBox
-IClass
-IComparable
-IComparer
 ICONINFO
-IConnection
-ICustom
-IDialog
 IDirect
-Idn
-IExplorer
-IFACEMETHOD
-IFile
-IGraphics
-IImage
 IInheritable
-IMap
 imm
-IObject
 iosfwd
-IPackage
 isa
-ISetup
 isspace
-IStorage
 istream
-IStringable
-ITab
-ITaskbar
-itow
-IUri
-IVirtual
 KEYSELECT
 LCID
 LINEBREAK
-llabs
-llu
-localtime
 lround
 Lsa
 lsass
 LSHIFT
 LTGRAY
 MAINWINDOW
-MAXIMIZEBOX
 medi
-memchr
 memicmp
 MENUCOMMAND
 MENUDATA
 MENUINFO
 MENUITEMINFOW
 MINIMIZEBOX
-mmeapi
 MOUSELEAVE
 mov
-mptt
-msappx
 MULTIPLEUSE
 NCHITTEST
 NCLBUTTONDBLCLK
@@ -148,7 +97,6 @@ NCPOINTERUPDATE
 NCRBUTTONDBLCLK
 NIF
 NIN
-NOAGGREGATION
 NOASYNC
 NOBREAKS
 NOCHANGEDIR
@@ -161,8 +109,6 @@ NOTIFYICONDATA
 ntprivapi
 NTSYSCALLAPI
 numr
-oaidl
-ocidl
 ODR
 offsetof
 ofstream
@@ -172,22 +118,17 @@ OSVERSIONINFOEXW
 otms
 OUTLINETEXTMETRICW
 overridable
-PACL
 PAGESCROLL
 PALLOC
 PATINVERT
-PEXPLICIT
 PICKFOLDERS
 PINPUT
 pmr
-ptstr
 QUERYENDSESSION
 rcx
 REGCLS
 RETURNCMD
 rfind
-RLO
-rnrn
 ROOTOWNER
 roundf
 RSHIFT
@@ -206,22 +147,17 @@ SHOWTIP
 SINGLEUSE
 SIZENS
 smoothstep
-snprintf
 SOFTBREAK
 spsc
-sregex
 SRWLOC
 srwlock
 SRWLOCK
 STDCPP
 STDMETHOD
-strchr
 strcpy
 streambuf
 strtoul
 Stubless
-Subheader
-Subpage
 syscall
 syscolors
 SYSTEMBACKDROP
@@ -238,23 +174,17 @@ tokeninfo
 tolower
 toupper
 TRACKMOUSEEVENT
-TTask
-TVal
 UChar
 UFIELD
 ULARGE
 UOI
 UPDATEINIFILE
 urlmon
-userenv
 USEROBJECTFLAGS
 Vcpp
 Viewbox
 virtualalloc
-vsnwprintf
 wcsnlen
-wcsstr
-wcstoui
 WDJ
 winhttp
 wininet
@@ -264,10 +194,8 @@ winstamin
 wmemcmp
 wpc
 WSF
-wsregex
 WWH
 wwinmain
-xchg
 XDocument
 XElement
 xfacet
diff --git a/.github/actions/spelling/allow/chinese.txt b/.github/actions/spelling/allow/chinese.txt
index 6b7ca2a917a..02ed0e4bae7 100644
--- a/.github/actions/spelling/allow/chinese.txt
+++ b/.github/actions/spelling/allow/chinese.txt
@@ -1,5 +1,4 @@
 CHINESEBIG
 choseong
-Jongseong
-Jungseong
-ssangtikeut
+Choseong
+CHOSEONG
diff --git a/.github/actions/spelling/allow/colors.txt b/.github/actions/spelling/allow/colors.txt
index b56723b3689..2b7192cf5b1 100644
--- a/.github/actions/spelling/allow/colors.txt
+++ b/.github/actions/spelling/allow/colors.txt
@@ -1,4 +1,3 @@
-alice
 aliceblue
 antiquewhite
 blanchedalmond
@@ -39,7 +38,6 @@ gainsboro
 ghostwhite
 greenyellow
 hotpink
-indian
 indianred
 lavenderblush
 lawngreen
@@ -74,7 +72,6 @@ mediumvioletred
 midnightblue
 mintcream
 mistyrose
-navajo
 navajowhite
 navyblue
 oldlace
@@ -88,7 +85,6 @@ papayawhip
 peachpuff
 peru
 powderblue
-rebecca
 rebeccapurple
 rosybrown
 royalblue
@@ -109,9 +105,4 @@ webgrey
 webmaroon
 webpurple
 whitesmoke
-xaroon
-xray
-xreen
-xrey
-xurple
 yellowgreen
diff --git a/.github/actions/spelling/allow/fonts.txt b/.github/actions/spelling/allow/fonts.txt
index c9931b2fc07..a0bacd06007 100644
--- a/.github/actions/spelling/allow/fonts.txt
+++ b/.github/actions/spelling/allow/fonts.txt
@@ -1,8 +1,8 @@
 Consolas
 emoji
 emojis
+Emojis
 Extralight
-Gabriola
 Iosevka
 MDL
 Monofur
diff --git a/.github/actions/spelling/allow/japanese.txt b/.github/actions/spelling/allow/japanese.txt
index 261f45dc2a1..6d941c08a50 100644
--- a/.github/actions/spelling/allow/japanese.txt
+++ b/.github/actions/spelling/allow/japanese.txt
@@ -1,4 +1 @@
-arigatoo
-doomo
-Kaomojis
 TATEGAKI
diff --git a/.github/actions/spelling/allow/math.txt b/.github/actions/spelling/allow/math.txt
index bf8960f0089..8c6041d4656 100644
--- a/.github/actions/spelling/allow/math.txt
+++ b/.github/actions/spelling/allow/math.txt
@@ -1,11 +1,2 @@
-atan
-CPrime
-HBar
-HPrime
 isnan
-LPrime
-LStep
-powf
-RSub
-sqrtf
 ULP
diff --git a/.github/actions/spelling/allow/microsoft.txt b/.github/actions/spelling/allow/microsoft.txt
index 940b0fc29d2..3f639c47468 100644
--- a/.github/actions/spelling/allow/microsoft.txt
+++ b/.github/actions/spelling/allow/microsoft.txt
@@ -4,12 +4,11 @@ advapi
 akv
 AKV
 altform
-altforms
+Altforms
 appendwttlogging
 appinstaller
 appx
 appxbundle
-appxerror
 appxmanifest
 ATL
 autoexec
@@ -25,66 +24,43 @@ CPRs
 cryptbase
 cscript
 DACL
-DACLs
 defaultlib
 diffs
 disposables
-dotnetfeed
-DTDs
-DWINRT
 enablewttlogging
 HOMESHARE
 Intelli
 issecret
-IVisual
 libucrt
 libucrtd
-LKG
 LOCKFILE
 Lxss
 makepri
-mfcribbon
 microsoft
-microsoftonline
 MSAA
 msixbundle
 MSVC
 MSVCP
 mtu
 muxc
-netcore
-Onefuzz
-osgvsowi
-PFILETIME
 pgc
 pgo
 pgosweep
-powerrename
 powershell
 priconfig
 PRIINFO
 propkey
 pscustomobject
 QWORD
-rdpclip
 regedit
 resfiles
-robocopy
 SACLs
-sdkddkver
 segoe
-Shobjidl
 sid
-Skype
 SRW
 sxs
 symbolrequestprod
 Sysinternals
-sysnative
-systemroot
-taskkill
-tasklist
-tdbuildteamid
 ucrt
 ucrtd
 unvirtualized
@@ -92,12 +68,9 @@ USERDNSDOMAIN
 VCRT
 vcruntime
 Virtualization
-visualstudio
 vscode
 VSTHRD
 WINBASEAPI
-winsdkver
-wlk
 wscript
 wslpath
 wtl
diff --git a/.github/actions/spelling/allow/names.txt b/.github/actions/spelling/allow/names.txt
index 11a1f95486b..a97ec94ac9c 100644
--- a/.github/actions/spelling/allow/names.txt
+++ b/.github/actions/spelling/allow/names.txt
@@ -1,4 +1,3 @@
-Anup
 arkthur
 austdi
 Ballmer
@@ -6,13 +5,11 @@ bhoj
 Bhojwani
 Bluloco
 carlos
-craigloewen
 dhowett
 Diviness
 dsafa
 duhowett
 DXP
-ekg
 eryksun
 ethanschoonover
 Firefox
@@ -25,70 +22,42 @@ Hernan
 Howett
 Illhardt
 Imms
-iquilezles
 italo
 jantari
 jerrysh
 Kaiyu
-kimwalisch
-KMehrain
-Kodelife
-KODELIFE
-Kourosh
-kowalczyk
 leonardder
-leonmsft
-Lepilleur
 lhecker
-lukesampson
-Macbook
-Manandhar
 masserano
-mbadolato
-Mehrain
 menger
-mgravell
-michaelniksa
-michkap
 migrie
 mikegr
 mikemaccana
-miloush
 miniksa
 nguyen
 niksa
 nvaccess
 nvda
-oising
-oldnewthing
-opengl
 osgwiki
 Ottosson
 pabhojwa
-panos
+Panos
 paulcam
-pauldotknopf
 PGP
 Pham
 Rincewind
-rprichard
 Schoonover
 shadertoy
 Shomnipotence
 simioni
-Somuah
 sonph
 sonpham
 stakx
-talo
 thereses
 Thysell
-Walisch
 WDX
 Wellons
 Westerman
-Wirt
-Wojciech
 zadjii
 Zamor
 zamora
@@ -96,4 +65,3 @@ Zamora
 zljubisic
 Zoey
 zorio
-Zverovich
diff --git a/.github/actions/spelling/candidate.patterns b/.github/actions/spelling/candidate.patterns
index 5d93035f915..d4053835145 100644
--- a/.github/actions/spelling/candidate.patterns
+++ b/.github/actions/spelling/candidate.patterns
@@ -1,3 +1,6 @@
+# Repeated letters
+\b([a-z])\g{-1}{2,}\b
+
 # marker to ignore all code on line
 ^.*/\* #no-spell-check-line \*/.*$
 # marker to ignore all code on line
@@ -7,6 +10,9 @@
 # cspell inline
 ^.*\b[Cc][Ss][Pp][Ee][Ll]{2}:\s*[Dd][Ii][Ss][Aa][Bb][Ll][Ee]-[Ll][Ii][Nn][Ee]\b
 
+# copyright
+Copyright (?:\([Cc]\)|)(?:[-\d, ]|and)+(?: [A-Z][a-z]+ [A-Z][a-z]+,?)+
+
 # patch hunk comments
 ^@@ -\d+(?:,\d+|) \+\d+(?:,\d+|) @@ .*
 # git index header
@@ -15,6 +21,9 @@ index (?:[0-9a-z]{7,40},|)[0-9a-z]{7,40}\.\.[0-9a-z]{7,40}
 # file permissions
 ['"`\s][-bcdLlpsw](?:[-r][-w][-Ssx]){2}[-r][-w][-SsTtx]\+?['"`\s]
 
+# css fonts
+\bfont(?:-family|):[^;}]+
+
 # css url wrappings
 \burl\([^)]+\)
 
@@ -32,9 +41,6 @@ index (?:[0-9a-z]{7,40},|)[0-9a-z]{7,40}\.\.[0-9a-z]{7,40}
 # https/http/file urls
 (?:\b(?:https?|ftp|file)://)[-A-Za-z0-9+&@#/*%?=~_|!:,.;]+[-A-Za-z0-9+&@#/*%=~_|]
 
-# https/http/file urls
-(?:\b(?:https?|ftp|file)://)[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]
-
 # mailto urls
 mailto:[-a-zA-Z=;:/?%&0-9+@._]{3,}
 
@@ -69,6 +75,8 @@ magnet:[?=:\w]+
 
 # Amazon
 \bamazon\.com/[-\w]+/(?:dp/[0-9A-Z]+|)
+# AWS ARN
+arn:aws:[-/:\w]+
 # AWS S3
 \b\w*\.s3[^.]*\.amazonaws\.com/[-\w/&#%_?:=]*
 # AWS execute-api
@@ -95,6 +103,8 @@ vpc-\w+
 \bgoogle-analytics\.com/collect.[-0-9a-zA-Z?%=&_.~]*
 # Google APIs
 \bgoogleapis\.(?:com|dev)/[a-z]+/(?:v\d+/|)[a-z]+/[-@:./?=\w+|&]+
+# Google Artifact Registry
+\.pkg\.dev(?:/[-\w]+)+(?::[-\w]+|)
 # Google Storage
 \b[-a-zA-Z0-9.]*\bstorage\d*\.googleapis\.com(?:/\S*|)
 # Google Calendar
@@ -130,6 +140,8 @@ themes\.googleusercontent\.com/static/fonts/[^/\s"]+/v\d+/[^.]+.
 \bscholar\.google\.com/citations\?user=[A-Za-z0-9_]+
 # Google Colab Research Drive
 \bcolab\.research\.google\.com/drive/[-0-9a-zA-Z_?=]*
+# Google Cloud regions
+(?:us|(?:north|south)america|europe|asia|australia|me|africa)-(?:north|south|east|west|central){1,2}\d+
 
 # GitHub SHAs (api)
 \bapi.github\.com/repos(?:/[^/\s"]+){3}/[0-9a-f]+\b
@@ -168,6 +180,12 @@ GHSA(?:-[0-9a-z]{4}){3}
 # GitLab commits
 \bgitlab\.[^/\s"]*/(?:[^/\s"]+/){2}commits?/[0-9a-f]+\b
 
+# #includes
+^\s*#include\s*(?:<.*?>|".*?")
+
+# #pragma lib
+^\s*#pragma comment\(lib, ".*?"\)
+
 # binance
 accounts\.binance\.com/[a-z/]*oauth/authorize\?[-0-9a-zA-Z&%]*
 
@@ -220,7 +238,7 @@ accounts\.binance\.com/[a-z/]*oauth/authorize\?[-0-9a-zA-Z&%]*
 \bmedium\.com/@?[^/\s"]+/[-\w]+
 
 # microsoft
-\b(?:https?://|)(?:(?:download\.visualstudio|docs|msdn2?|research)\.microsoft|blogs\.msdn)\.com/[-_a-zA-Z0-9()=./%]*
+\b(?:https?://|)(?:(?:(?:blogs|download\.visualstudio|docs|msdn2?|research)\.|)microsoft|blogs\.msdn)\.co(?:m|\.\w\w)/[-_a-zA-Z0-9()=./%]*
 # powerbi
 \bapp\.powerbi\.com/reportEmbed/[^"' ]*
 # vs devops
@@ -394,7 +412,7 @@ ipfs://[0-9a-zA-Z]{3,}
 \bgetopts\s+(?:"[^"]+"|'[^']+')
 
 # ANSI color codes
-(?:\\(?:u00|x)1[Bb]|\x1b|\\u\{1[Bb]\})\[\d+(?:;\d+|)m
+(?:\\(?:u00|x)1[Bb]|\\03[1-7]|\x1b|\\u\{1[Bb]\})\[\d+(?:;\d+)*m
 
 # URL escaped characters
 %[0-9A-F][A-F](?=[A-Za-z])
@@ -431,10 +449,14 @@ sha\d+:[0-9a-f]*?[a-f]{3,}[0-9a-f]*
 # pki (base64)
 LS0tLS1CRUdJT.*
 
+# C# includes
+^\s*using [^;]+;
+
 # uuid:
 \b[0-9a-fA-F]{8}-(?:[0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12}\b
 # hex digits including css/html color classes:
-(?:[\\0][xX]|\\u|[uU]\+|#x?|%23)[0-9_a-fA-FgGrR]*?[a-fA-FgGrR]{2,}[0-9_a-fA-FgGrR]*(?:[uUlL]{0,3}|[iu]\d+)\b
+(?:[\\0][xX]|\\u|[uU]\+|#x?|%23|&H)[0-9_a-fA-FgGrR]*?[a-fA-FgGrR]{2,}[0-9_a-fA-FgGrR]*(?:[uUlL]{0,3}|[iu]\d+)\b
+
 # integrity
 integrity=(['"])(?:\s*sha\d+-[-a-zA-Z=;:/0-9+]{40,})+\g{-1}
 
@@ -452,7 +474,10 @@ integrity=(['"])(?:\s*sha\d+-[-a-zA-Z=;:/0-9+]{40,})+\g{-1}
 Name\[[^\]]+\]=.*
 
 # IServiceProvider / isAThing
-(?:\b|_)(?:(?:ns|)I|isA)(?=(?:[A-Z][a-z]{2,})+(?:[A-Z\d]|\b))
+(?:(?:\b|_|(?<=[a-z]))I|(?:\b|_)(?:nsI|isA))(?=(?:[A-Z][a-z]{2,})+(?:[A-Z\d]|\b))
+
+# python
+\b(?i)py(?!gments|gmy|lon|ramid|ro|th)(?=[a-z]{2,})
 
 # crypt
 (['"])\$2[ayb]\$.{56}\g{-1}
@@ -466,17 +491,14 @@ Name\[[^\]]+\]=.*
 # machine learning (?)
 \b(?i)ml(?=[a-z]{2,})
 
-# python
-\b(?i)py(?!gments|gmy|lon|ramid|ro|th)(?=[a-z]{2,})
-
 # scrypt / argon
 \$(?:scrypt|argon\d+[di]*)\$\S+
 
 # go.sum
 \bh1:\S+
 
-# scala imports
-^import (?:[\w.]|\{\w*?(?:,\s*(?:\w*|\*))+\})+
+# imports
+^import\s+(?:(?:static|type)\s+|)(?:[\w.]|\{\s*\w*?(?:,\s*(?:\w*|\*))+\s*\})+
 
 # scala modules
 ("[^"]+"\s*%%?\s*){2,3}"[^"]+"
@@ -485,7 +507,7 @@ Name\[[^\]]+\]=.*
 image: [-\w./:@]+
 
 # Docker images
-^\s*FROM\s+\S+:\S+(?:\s+AS\s+\S+|)
+^\s*(?i)FROM\s+\S+:\S+(?:\s+AS\s+\S+|)
 
 # `docker images` REPOSITORY TAG IMAGE ID CREATED SIZE
 \s*\S+/\S+\s+\S+\s+[0-9a-f]{8,}\s+\d+\s+(?:hour|day|week)s ago\s+[\d.]+[KMGT]B
@@ -501,6 +523,7 @@ content: (['"])[-a-zA-Z=;:/0-9+]*=\g{-1}
 # The `(?=.*?")` suffix should limit the false positives rate
 # printf
 #%(?:(?:(?:hh?|ll?|[jzt])?[diuoxn]|l?[cs]|L?[fega]|p)(?=[a-z]{2,})|(?:X|L?[FEGA])(?=[a-zA-Z]{2,}))(?!%)(?=[_a-zA-Z]+(?!%)\b)(?=.*?['"])
+
 # Alternative printf
 # %s
 %(?:s(?=[a-z]{2,}))(?!%)(?=[_a-zA-Z]+(?!%[^s])\b)(?=.*?['"])
@@ -524,7 +547,7 @@ content: (['"])[-a-zA-Z=;:/0-9+]*=\g{-1}
 # javascript replace regex
 \.replace\(/[^/\s"]{3,}/[gim]*\s*,
 # assign regex
-= /[^*].*?(?:[a-z]{3,}|[A-Z]{3,}|[A-Z][a-z]{2,}).*/[gi]?(?=\W|$)
+= /[^*].*?(?:[a-z]{3,}|[A-Z]{3,}|[A-Z][a-z]{2,}).*/[gim]*(?=\W|$)
 # perl regex test
 [!=]~ (?:/.*/|m\{.*?\}|m<.*?>|m([|!/@#,;']).*?\g{-1})
 
@@ -538,7 +561,7 @@ perl(?:\s+-[a-zA-Z]\w*)+
 (?:\d|\bh)to(?!ken)(?=[a-z])|to(?=[adhiklpun]\()
 
 # Go regular expressions
-regexp?\.MustCompile\(`[^`]*`\)
+regexp?\.MustCompile\((?:`[^`]*`|".*"|'.*')\)
 
 # regex choice
 \(\?:[^)]+\|[^)]+\)
@@ -586,7 +609,7 @@ urn:shemas-jetbrains-com
 # xcode
 
 # xcodeproject scenes
-(?:Controller|destination|ID|id)="\w{3}-\w{2}-\w{3}"
+(?:Controller|destination|(?:first|second)Item|ID|id)="\w{3}-\w{2}-\w{3}"
 
 # xcode api botches
 customObjectInstantitationMethod
@@ -601,14 +624,17 @@ PrependWithABINamepsace
 \.fa-[-a-z0-9]+
 
 # bearer auth
-(['"])[Bb]ear[e][r] .*?\g{-1}
+(['"])[Bb]ear[e][r] .{3,}?\g{-1}
 
 # bearer auth
-\b[Bb]ear[e][r]:? [-a-zA-Z=;:/0-9+.]+
+\b[Bb]ear[e][r]:? [-a-zA-Z=;:/0-9+.]{3,}
 
 # basic auth
 (['"])[Bb]asic [-a-zA-Z=;:/0-9+]{3,}\g{-1}
 
+# basic auth
+: [Bb]asic [-a-zA-Z=;:/0-9+.]{3,}
+
 # base64 encoded content
 #([`'"])[-a-zA-Z=;:/0-9+]{3,}=\g{-1}
 # base64 encoded content in xml/sgml
@@ -620,6 +646,9 @@ PrependWithABINamepsace
 # base64 encoded pkcs
 #\bMII[-a-zA-Z=;:/0-9+]+
 
+# uuencoded
+#[!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_]{40,}
+
 # DNS rr data
 #(?:\d+\s+){3}(?:[-+/=.\w]{2,}\s*){1,2}
 
@@ -630,7 +659,7 @@ PrependWithABINamepsace
 \bnumer\b(?=.*denom)
 
 # Time Zones
-\b(?:Africa|Atlantic|America|Antarctica|Asia|Australia|Europe|Indian|Pacific)(?:/\w+)+
+\b(?:Africa|Atlantic|America|Antarctica|Arctic|Asia|Australia|Europe|Indian|Pacific)(?:/[-\w]+)+
 
 # linux kernel info
 ^(?:bugs|flags|Features)\s+:.*
@@ -676,11 +705,17 @@ TeX/AMS
 "varsIgnorePattern": ".+"
 
 # nolint
-nolint:\w+
+nolint:\s*[\w,]+
 
 # Windows short paths
 [/\\][^/\\]{5,6}~\d{1,2}(?=[/\\])
 
+# Windows Resources with accelerators
+\b[A-Z]&[a-z]+\b(?!;)
+
+# signed off by
+(?i)Signed-off-by: .*
+
 # cygwin paths
 /cygdrive/[a-zA-Z]/(?:Program Files(?: \(.*?\)| ?)(?:/[-+.~\\/()\w ]+)*|[-+.~\\/()\w])+
 
@@ -715,29 +750,29 @@ W/"[^"]+"
 
 # Compiler flags (Unix, Java/Scala)
 # Use if you have things like `-Pdocker` and want to treat them as `docker`
-#(?:^|[\t ,>"'`=(])-(?:(?:J-|)[DPWXY]|[Llf])(?=[A-Z]{2,}|[A-Z][a-z]|[a-z]{2,})
+#(?:^|[\t ,>"'`=(#])-(?:(?:J-|)[DPWXY]|[Llf])(?=[A-Z]{2,}|[A-Z][a-z]|[a-z]{2,})
 
 # Compiler flags (Windows / PowerShell)
 # This is a subset of the more general compiler flags pattern.
 # It avoids matching `-Path` to prevent it from being treated as `ath`
-#(?:^|[\t ,"'`=(])-(?:[DPL](?=[A-Z]{2,})|[WXYlf](?=[A-Z]{2,}|[A-Z][a-z]|[a-z]{2,}))
+#(?:^|[\t ,"'`=(#])-(?:[DPL](?=[A-Z]{2,})|[WXYlf](?=[A-Z]{2,}|[A-Z][a-z]|[a-z]{2,}))
 
 # Compiler flags (linker)
 ,-B
 
 # libraries
-#(?:\b|_)lib(?:re(?=office)|)(?!era[lt]|ero|erty|rar(?:i(?:an|es)|y))(?=[a-z])
-
-# WWNN/WWPN (NAA identifiers)
-\b(?:0x)?10[0-9a-f]{14}\b|\b(?:0x|3)?[25][0-9a-f]{15}\b|\b(?:0x|3)?6[0-9a-f]{31}\b
+#(?:\b|_)[Ll]ib(?:re(?=office)|)(?!era[lt]|ero|erty|rar(?:i(?:an|es)|y))(?=[a-z])
 
 # iSCSI iqn (approximate regex)
 \biqn\.[0-9]{4}-[0-9]{2}(?:[\.-][a-z][a-z0-9]*)*\b
 
+# WWNN/WWPN (NAA identifiers)
+\b(?:0x)?10[0-9a-f]{14}\b|\b(?:0x|3)?[25][0-9a-f]{15}\b|\b(?:0x|3)?6[0-9a-f]{31}\b
+
 # curl arguments
 \b(?:\\n|)curl(?:\.exe|)(?:\s+-[a-zA-Z]{1,2}\b)*(?:\s+-[a-zA-Z]{3,})(?:\s+-[a-zA-Z]+)*
 # set arguments
-\b(?:bash|sh|set)(?:\s+-[abefimouxE]{1,2})*\s+-[abefimouxE]{3,}(?:\s+-[abefimouxE]+)*
+\b(?:bash|sh|set)(?:\s+[-+][abefimouxE]{1,2})*\s+[-+][abefimouxE]{3,}(?:\s+[-+][abefimouxE]+)*
 # tar arguments
 \b(?:\\n|)g?tar(?:\.exe|)(?:(?:\s+--[-a-zA-Z]+|\s+-[a-zA-Z]+|\s[ABGJMOPRSUWZacdfh-pr-xz]+\b)(?:=[^ ]*|))+
 # tput arguments -- https://man7.org/linux/man-pages/man5/terminfo.5.html -- technically they can be more than 5 chars long...
diff --git a/.github/actions/spelling/excludes.txt b/.github/actions/spelling/excludes.txt
index c142f11548f..23511535fb5 100644
--- a/.github/actions/spelling/excludes.txt
+++ b/.github/actions/spelling/excludes.txt
@@ -97,7 +97,7 @@ Resources/(?!en)
 ^doc/reference/UTF8-torture-test\.txt$
 ^doc/reference/windows-terminal-logo\.ans$
 ^NOTICE.md
-^oss/
+^oss/.*?/
 ^samples/PixelShaders/Screenshots/
 ^src/cascadia/TerminalSettingsEditor/SegoeFluentIconList.h$
 ^src/interactivity/onecore/BgfxEngine\.
@@ -121,8 +121,8 @@ Resources/(?!en)
 ^tools/ReleaseEngineering/ServicingPipeline\.ps1$
 ^XamlStyler\.json$
 ^\.github/actions/spelling/
+^\.github/workflows/spelling\d*\.yml$
 ^\.vsconfig$
-^\Q.github/workflows/spelling.yml\E$
 ^\Qbuild/config/release.gdnbaselines\E$
 ^\Qdep/WinAppDriver/EULA.rtf\E$
 ^\Qdoc/reference/windows-terminal-logo.ans\E$
diff --git a/.github/actions/spelling/expect/alphabet.txt b/.github/actions/spelling/expect/alphabet.txt
index 1ff5611c38b..73bbdffb3cb 100644
--- a/.github/actions/spelling/expect/alphabet.txt
+++ b/.github/actions/spelling/expect/alphabet.txt
@@ -1,38 +1,19 @@
-AAAAAABBBBBBCCC
-AAAAABBBBBBCCC
-abcd
-ABCDEFGHIJ
-abcdefghijk
-ABCDEFGHIJKLMNOPQRS
-ABCDEFGHIJKLMNOPQRST
-ABCDEFGHIJKLMNOPQRSTUVWXY
 ABCG
 ABE
-abf
-BBBBB
-BBBBBCCC
-BBBBCCCCC
+AZZ
+BBDM
 BBGGRR
-EFG
+CBN
+cbt
+Ccc
+cch
 efg
-EFGh
 efgh
-KLMNOQQQQQQQQQQ
-QQQQQQQQQQABCDEFGHIJ
-QQQQQQQQQQABCDEFGHIJKLMNOPQRS
-QQQQQQQQQQABCDEFGHIJKLMNOPQRSTQQQQQQQQQ
-QQQQQQQQQQABCDEFGHIJKLMNOPQRSTQQQQQQQQQQ
-QQQQQQQQQQABCDEFGHIJPQRST
-QQQQQQQQQQABCDEFGHIJPQRSTQQQQQQQQQQ
+fdw
+fesb
+ffd
+FFFD
 qwerty
 qwertyuiopasdfg
-ZAAZZ
-ZABBZ
-ZBAZZ
-ZBBBZ
-ZBBZZ
 ZYXWVUT
-ZZBBZ
-ZZZBB
-ZZZBZ
-ZZZZZ
+zzf
diff --git a/.github/actions/spelling/expect/expect.txt b/.github/actions/spelling/expect/expect.txt
index 318903fe177..3507bf387b1 100644
--- a/.github/actions/spelling/expect/expect.txt
+++ b/.github/actions/spelling/expect/expect.txt
@@ -2,7 +2,6 @@ aaaaabbb
 aabbcc
 ABANDONFONT
 abbcc
-ABCF
 abgr
 ABORTIFHUNG
 ACCESSTOKEN
@@ -26,13 +25,11 @@ AImpl
 AInplace
 ALIGNRIGHT
 allocing
-allocs
 alpc
 ALTERNATENAME
 ALTF
 ALTNUMPAD
 ALWAYSTIP
-aml
 ansicpg
 ANSISYS
 ANSISYSRC
@@ -49,22 +46,17 @@ APIENTRY
 apiset
 APPBARDATA
 appcontainer
-appium
 appletname
-applicationmodel
 APPLMODAL
 Applocal
 appmodel
+appshellintegration
 APPWINDOW
 APPXMANIFESTVERSION
 APrep
-apsect
 APSTUDIO
-archeologists
-Argb
 ARRAYSIZE
 ARROWKEYS
-asan
 ASBSET
 ASetting
 ASingle
@@ -72,11 +64,11 @@ ASYNCDONTCARE
 ASYNCWINDOWPOS
 atch
 ATest
+atg
 aumid
 Authenticode
 AUTOBUDDY
 AUTOCHECKBOX
-autocrlf
 autohide
 AUTOHSCROLL
 automagically
@@ -92,10 +84,8 @@ AZZ
 backgrounded
 Backgrounder
 backgrounding
-backported
 backstory
 Bazz
-bbb
 bbccb
 BBDM
 bbwe
@@ -123,13 +113,13 @@ bitmasks
 BITOPERATION
 BKCOLOR
 BKGND
+BKMK
 Bksp
 Blt
 blu
 BLUESCROLL
 bmi
 bodgy
-BODGY
 BOLDFONT
 Borland
 boutput
@@ -148,9 +138,7 @@ buflen
 buildsystems
 buildtransitive
 BValue
-bytebuffer
-cac
-cacafire
+Cacafire
 CALLCONV
 CANDRABINDU
 capslock
@@ -161,12 +149,6 @@ catid
 cazamor
 CBash
 cbiex
-CBN
-cbt
-Ccc
-CCCBB
-CCCDDD
-cch
 CCHAR
 CCmd
 ccolor
@@ -181,15 +163,14 @@ cfie
 cfiex
 cfte
 CFuzz
+cgmanifest
 cgscrn
 chafa
 changelists
 CHARSETINFO
-chh
 chshdng
 CHT
 CLASSSTRING
-CLE
 cleartype
 CLICKACTIVE
 clickdown
@@ -212,9 +193,7 @@ cmw
 CNL
 cnn
 Codeflow
-codenav
 codepages
-codepath
 coinit
 colorizing
 COLORONCOLOR
@@ -226,13 +205,8 @@ colortbl
 colortest
 colortool
 COLORVALUE
-combaseapi
 comctl
-commandline
-commctrl
 commdlg
-COMMITID
-componentization
 conapi
 conattrs
 conbufferout
@@ -250,7 +224,6 @@ conintegrityuwp
 coninteractivitybase
 coninteractivityonecore
 coninteractivitywin
-conio
 coniosrv
 CONKBD
 conlibk
@@ -263,13 +236,13 @@ conpropsp
 conpty
 conptylib
 conserv
+consoleaccessibility
 consoleapi
 CONSOLECONTROL
 CONSOLEENDTASK
 consolegit
 consolehost
 CONSOLEIME
-consoleinternal
 CONSOLESETFOREGROUND
 consoletaeftemplates
 consoleuwp
@@ -277,7 +250,6 @@ Consolewait
 CONSOLEWINDOWOWNER
 consrv
 constexprable
-constness
 contentfiles
 conterm
 contsf
@@ -311,7 +283,6 @@ csbi
 csbiex
 CSHORT
 Cspace
-csrmsg
 CSRSS
 csrutil
 CSTYLE
@@ -368,16 +339,14 @@ DBGFONTS
 DBGOUTPUT
 dbh
 dblclk
+DBUILD
 Dcd
 DColor
-dcommon
+DCOMMON
 DComposition
-DDDCCC
-dde
 DDESHARE
 DDevice
 DEADCHAR
-dealloc
 Debian
 debugtype
 DECAC
@@ -482,18 +451,16 @@ DELAYLOAD
 DELETEONRELEASE
 depersist
 deprioritized
-deserializers
-desktopwindowxamlsource
 devicecode
 Dext
 DFactory
 DFF
 dialogbox
+DINLINE
 directio
 DIRECTX
 DISABLEDELAYEDEXPANSION
 DISABLENOSCROLL
-DISPATCHNOTIFY
 DISPLAYATTRIBUTE
 DISPLAYCHANGE
 distros
@@ -530,9 +497,10 @@ dsm
 dsound
 DSSCL
 DSwap
-DTest
 DTo
 DTTERM
+DUNICODE
+DUNIT
 dup'ed
 dvi
 dwl
@@ -542,8 +510,6 @@ dwmapi
 DWORDs
 dwrite
 dxgi
-dxgidwm
-dxinterop
 dxsm
 dxttbmp
 Dyreen
@@ -557,7 +523,6 @@ EDITKEYS
 EDITTEXT
 EDITUPDATE
 Efast
-efghijklmn
 EHsc
 EINS
 ELEMENTNOTAVAILABLE
@@ -566,7 +531,6 @@ enabledelayedexpansion
 ENDCAP
 endptr
 ENTIREBUFFER
-entrypoints
 ENU
 ENUMLOGFONT
 ENUMLOGFONTEX
@@ -581,7 +545,6 @@ esrp
 ESV
 ETW
 EUDC
-EVENTID
 eventing
 evflags
 evt
@@ -603,16 +566,6 @@ FACESIZE
 FAILIFTHERE
 fastlink
 fcharset
-FDEA
-fdw
-FECF
-FEEF
-fesb
-FFAF
-ffd
-FFDE
-FFFD
-FFFDb
 fgbg
 FGCOLOR
 FGHIJ
@@ -630,7 +583,6 @@ FINDDLG
 FINDDOWN
 FINDREGEX
 FINDSTRINGEXACT
-FINDUP
 FITZPATRICK
 FIXEDFILEINFO
 Flg
@@ -665,7 +617,6 @@ Ftm
 Fullscreens
 Fullwidth
 FUNCTIONCALL
-fuzzer
 fuzzmain
 fuzzmap
 fuzzwrapper
@@ -729,6 +680,7 @@ GETWHEELSCROLLCHARS
 GETWHEELSCROLLLINES
 Gfun
 gfx
+gfycat
 GGI
 GHgh
 GHIJK
@@ -749,6 +701,7 @@ Greyscale
 gridline
 gset
 gsl
+Guake
 guc
 GUIDATOM
 GValue
@@ -778,7 +731,6 @@ hfind
 hfont
 hfontresource
 hglobal
-hhh
 hhook
 hhx
 HIBYTE
@@ -794,7 +746,6 @@ HKCU
 hkey
 hkl
 HKLM
-hlocal
 hlsl
 HMB
 HMK
@@ -813,7 +764,6 @@ HREDRAW
 hresult
 hscroll
 hstr
-hstring
 HTBOTTOMLEFT
 HTBOTTOMRIGHT
 HTCAPTION
@@ -842,14 +792,12 @@ idl
 idllib
 IDOK
 IDR
-idth
 IDTo
 IDXGI
 IFACEMETHODIMP
 ification
 IGNORELANGUAGE
 iid
-IInput
 IIo
 ILC
 ILCo
@@ -863,20 +811,18 @@ INFOEX
 inheritcursor
 INITCOMMONCONTROLSEX
 INITDIALOG
-initguid
+INITGUID
 INITMENU
 inkscape
 INLINEPREFIX
 inproc
 Inputkeyinfo
-inputpaneinterop
 Inputreadhandledata
 INPUTSCOPE
 INSERTMODE
 INTERACTIVITYBASE
 INTERCEPTCOPYPASTE
 INTERNALNAME
-Interner
 intsafe
 INVALIDARG
 INVALIDATERECT
@@ -888,8 +834,6 @@ itermcolors
 itf
 Ith
 IUI
-IUnknown
-ivalid
 IWIC
 IXP
 jconcpp
@@ -913,7 +857,6 @@ keydowns
 KEYFIRST
 KEYLAST
 Keymapping
-keyscan
 keystate
 keyups
 Kickstart
@@ -923,10 +866,6 @@ kinda
 KIYEOK
 KLF
 KLMNO
-KLMNOPQRST
-KLMNOPQRSTQQQQQ
-KLMNOPQRSTUVWXY
-KLMNOPQRSTY
 KOK
 KPRIORITY
 KVM
@@ -948,6 +887,8 @@ LCONTROL
 LCTRL
 lcx
 LEFTALIGN
+libsancov
+libtickit
 LIMITTEXT
 LINEDOWN
 LINESELECTION
@@ -1052,6 +993,7 @@ MBUTTONDOWN
 MBUTTONUP
 mdmerge
 MDs
+mdtauk
 MEASUREITEM
 megamix
 memallocator
@@ -1061,7 +1003,6 @@ MENUCONTROL
 MENUDROPALIGNMENT
 MENUITEMINFO
 MENUSELECT
-messageext
 metaproj
 Mgrs
 microsoftpublicsymbols
@@ -1078,11 +1019,9 @@ minwindef
 MMBB
 mmcc
 MMCPL
-mmsystem
 MNC
 MNOPQ
 MNOPQR
-MNOPQRSTUVWXY
 MODALFRAME
 MODERNCORE
 MONITORINFO
@@ -1094,7 +1033,6 @@ MOUSEHWHEEL
 MOVESTART
 msb
 msbuildcache
-msctf
 msctls
 msdata
 MSDL
@@ -1109,10 +1047,9 @@ MSGSELECTMODE
 msiexec
 MSIL
 msix
-msrc
+MSRC
 MSVCRTD
 MTSM
-Munged
 murmurhash
 muxes
 myapplet
@@ -1151,7 +1088,6 @@ Newtonsoft
 NEXTLINE
 nfe
 NLSMODE
-nnn
 NOACTIVATE
 NOAPPLYNOW
 NOCLIP
@@ -1204,40 +1140,31 @@ NPFS
 nrcs
 NSTATUS
 ntapi
-ntcon
-ntcsrdll
 ntdef
 NTDEV
 ntdll
 ntifs
-ntlpcapi
 ntm
-ntrtl
 ntstatus
 nttree
-nturtl
 ntuser
 NTVDM
-ntverp
 nugetversions
 NUKTA
 nullness
 nullonfailure
 nullopts
-numlock
 NUMSCROLL
 NUnit
 nupkg
 NVIDIA
 NVT
 OACR
-objbase
 ocolor
 oemcp
 OEMFONT
 OEMFORMAT
 OEMs
-offboarded
 OLEAUT
 OLECHAR
 onebranch
@@ -1287,7 +1214,6 @@ PALPC
 pankaj
 parentable
 PATCOPY
-pathcch
 PATTERNID
 pbstr
 pcb
@@ -1342,7 +1268,6 @@ phicon
 phwnd
 pidl
 PIDLIST
-pids
 pii
 piml
 pimpl
@@ -1367,11 +1292,9 @@ POINTERUPDATE
 POINTSLIST
 policheck
 POLYTEXTW
-poppack
 POPUPATTR
 popups
 PORFLG
-positionals
 POSTCHARBREAKS
 POSX
 POSXSCROLL
@@ -1404,11 +1327,9 @@ PREVLINE
 prg
 pri
 prioritization
-processenv
 processhost
 PROCESSINFOCLASS
 PRODEXT
-Productize
 PROPERTYID
 PROPERTYKEY
 propertyval
@@ -1420,16 +1341,13 @@ propsys
 PROPTITLE
 propvar
 propvariant
-propvarutil
 psa
 PSCRED
 PSECURITY
 pseudoconsole
-pseudoterminal
 psh
 pshn
 PSHNOTIFY
-pshpack
 PSINGLE
 psl
 psldl
@@ -1501,8 +1419,6 @@ REGISTERVDM
 regkey
 REGSTR
 RELBINPATH
-remoting
-renamer
 rendersize
 reparented
 reparenting
@@ -1537,19 +1453,16 @@ RIGHTALIGN
 RIGHTBUTTON
 riid
 ris
-roadmap
 robomac
 rodata
 rosetta
 RRF
-rrr
 RRRGGGBB
 rsas
 rtcore
 RTEXT
 RTLREADING
 Rtn
-ruleset
 runas
 RUNDLL
 runformat
@@ -1567,7 +1480,6 @@ rvpa
 RWIN
 rxvt
 safemath
-sancov
 sba
 SBCS
 SBCSDBCS
@@ -1595,10 +1507,8 @@ SCROLLSCREENBUFFER
 scursor
 sddl
 SDKDDK
-securityappcontainer
 segfault
 SELCHANGE
-SELECTALL
 SELECTEDFONT
 SELECTSTRING
 Selfhosters
@@ -1642,14 +1552,10 @@ SFUI
 sgr
 SHCo
 shcore
-shellapi
 shellex
-shellscalingapi
 SHFILEINFO
 SHGFI
 SHIFTJIS
-shlguid
-shlobj
 shlwapi
 SHORTPATH
 SHOWCURSOR
@@ -1687,7 +1593,6 @@ snapcy
 snk
 SOLIDBOX
 Solutiondir
-somefile
 sourced
 SRCAND
 SRCCODEPAGE
@@ -1719,9 +1624,8 @@ STDEXT
 STDMETHODCALLTYPE
 STDMETHODIMP
 STGM
-Stringable
 STRINGTABLE
-strsafe
+STRSAFE
 STUBHEAD
 STUVWX
 stylecop
@@ -1747,32 +1651,27 @@ SYSLIB
 SYSLINK
 SYSMENU
 sysparams
-sysparamsext
 SYSTEMHAND
 SYSTEMMENU
 SYSTEMTIME
 tabview
-TAdd
 taef
 TARG
 targetentrypoint
 TARGETLIBS
 TARGETNAME
 targetver
-TBase
 tbc
 tbi
 Tbl
 TBM
-tchar
+TCHAR
 TCHFORMAT
 TCI
 tcommands
 tdbuild
 Tdd
-TDelegated
 TDP
-tearoff
 Teb
 Techo
 tellp
@@ -1782,7 +1681,6 @@ terminalinput
 terminalrenderdata
 TERMINALSCROLLING
 terminfo
-TEs
 testcon
 testd
 testenvs
@@ -1794,7 +1692,6 @@ TESTNULL
 testpass
 testpasses
 TEXCOORD
-TExpected
 textattribute
 TEXTATTRIBUTEID
 textboxes
@@ -1805,39 +1702,28 @@ TEXTMETRIC
 TEXTMETRICW
 textmode
 texttests
-TFunction
 THUMBPOSITION
 THUMBTRACK
-tickit
-TIcon
 tilunittests
 titlebars
 TITLEISLINKNAME
-TJson
-TLambda
 TLDP
 TLEN
 TMAE
 TMPF
-TMult
 tmultiple
-TODOs
 tofrom
-tokenhelpers
 toolbars
 TOOLINFO
 TOOLWINDOW
 TOPDOWNDIB
-TOpt
 tosign
-touchpad
 tracelogging
 traceviewpp
 trackbar
 trackpad
 transitioning
 Trd
-TREX
 triaged
 triaging
 TRIMZEROHEADINGS
@@ -1845,9 +1731,7 @@ trx
 tsa
 tsgr
 tsm
-TStr
 TSTRFORMAT
-TSub
 TTBITMAP
 TTFONT
 TTFONTLIST
@@ -1856,7 +1740,6 @@ TTo
 tvpp
 tvtseq
 TYUI
-UAC
 uap
 uapadmin
 UAX
@@ -1892,7 +1775,6 @@ unk
 unknwn
 UNORM
 unparseable
-Unregistering
 untextured
 UPDATEDISPLAY
 UPDOWN
@@ -1910,7 +1792,6 @@ USEFILLATTRIBUTE
 USEGLYPHCHARS
 USEHICON
 USEPOSITION
-USERDATA
 userdpiapi
 Userp
 userprivapi
@@ -1923,7 +1804,6 @@ USRDLL
 utext
 utr
 UVWXY
-UVWXYZ
 uwa
 uwp
 uwu
@@ -1932,17 +1812,16 @@ Vanara
 vararg
 vclib
 vcxitems
-vectorize
 VERCTRL
 VERTBAR
 VFT
 vga
 vgaoem
 viewkind
-viewports
 VIRAMA
 Virt
 VIRTTERM
+visualstudiosdk
 vkey
 VKKEYSCAN
 VMs
@@ -2001,7 +1880,6 @@ wekyb
 wewoad
 wex
 wextest
-wextestclass
 WFill
 wfopen
 WHelper
@@ -2012,9 +1890,7 @@ Wiggum
 wil
 WImpl
 WINAPI
-winbase
 winbasep
-wincodec
 wincon
 winconp
 winconpty
@@ -2029,10 +1905,8 @@ windll
 WINDOWALPHA
 windowdpiapi
 WINDOWEDGE
-windowext
 WINDOWINFO
 windowio
-windowmetrics
 WINDOWPLACEMENT
 windowpos
 WINDOWPOSCHANGED
@@ -2040,20 +1914,15 @@ WINDOWPOSCHANGING
 windowproc
 windowrect
 windowsapp
-windowsinternalstring
 WINDOWSIZE
 windowsshell
 windowsterminal
-windowsx
 windowtheme
 winevent
-wingdi
 winget
 wingetcreate
 WINIDE
-winioctl
 winmd
-winmeta
 winmgr
 winmm
 WINMSAPP
@@ -2063,8 +1932,8 @@ WInplace
 winres
 winrt
 winternl
+winui
 winuser
-winuserp
 WINVER
 wistd
 wmain
@@ -2101,10 +1970,9 @@ WRITECONSOLEINPUT
 WRITECONSOLEOUTPUT
 WRITECONSOLEOUTPUTSTRING
 wrkstr
-wrl
+WRL
 wrp
 WRunoff
-wsl
 WSLENV
 wstr
 wstrings
@@ -2117,7 +1985,7 @@ wtof
 WTs
 WTSOFTFONT
 wtw
-wtypes
+Wtypes
 WUX
 WVerify
 WWith
@@ -2136,7 +2004,6 @@ XBUTTONDOWN
 XBUTTONUP
 XCast
 XCENTER
-xchar
 xcopy
 XCount
 xdy
@@ -2146,6 +2013,7 @@ XFG
 XFile
 XFORM
 XIn
+xkcd
 XManifest
 XMath
 XNamespace
@@ -2172,7 +2040,6 @@ YLimit
 YPan
 YSubstantial
 YVIRTUALSCREEN
-Zab
 zabcd
 Zabcdefghijklmn
 Zabcdefghijklmnopqrstuvwxyz
@@ -2181,4 +2048,3 @@ ZCtrl
 ZWJs
 ZYXWVU
 ZYXWVUTd
-zzf
diff --git a/.github/actions/spelling/line_forbidden.patterns b/.github/actions/spelling/line_forbidden.patterns
index 5617a8af5f7..ecfead2f0ce 100644
--- a/.github/actions/spelling/line_forbidden.patterns
+++ b/.github/actions/spelling/line_forbidden.patterns
@@ -8,6 +8,24 @@
 # you might not want to check in code where you skip all the other tests.
 #\bfit\(
 
+# English does not use a hyphen between adverbs and nouns
+# https://twitter.com/nyttypos/status/1894815686192685239
+(?:^|\s)[A-Z]?[a-z]+ly-(?=[a-z]{3,})(?:[.,?!]?\s|$)
+
+# Don't use `requires that` + `to be`
+# https://twitter.com/nyttypos/status/1894816551435641027
+\brequires that \w+\b[^.]+to be\b
+
+# A fully parenthetical sentence’s period goes inside the parentheses, not outside.
+# https://twitter.com/nyttypos/status/1898844061873639490
+\([A-Z][a-z]{2,}(?: [a-z]+){3,}\)\.\s
+
+# Complete sentences shouldn't be in the middle of another sentence as a parenthetical.
+(?<!\.)(?<!\betc)\.\),
+
+# Complete sentences in parentheticals should not have a space before the period.
+\s\.\)(?!.*\}\})
+
 # Should be `HH:MM:SS`
 \bHH:SS:MM\b
 
@@ -24,18 +42,52 @@
 # Should be `a priori` or `and prior`
 (?i)(?<!posteriori)\sand priori\s
 
+# Should be `a`
+\san (?=(?:[b-df-gj-np-rtv-xz]|h(?!our|sl|tml|ttp)|s(?!sh|vg))[a-z])
+
 # Should only be one of `a`, `an`, or `the`
 \b(?:(?:an?|the)\s+){2,}\b
 
+# Should only be `are` or `can`, not both
+\b(?:(?:are|can)\s+){2,}\b
+
+# Should probably be `ABCDEFGHIJKLMNOPQRSTUVWXYZ`
+(?i)(?!ABCDEFGHIJKLMNOPQRSTUVWXYZ)ABC[A-Z]{21}YZ
+
+# Should be `an`
+(?<!\b[Ii] )\bam\b
+
 # Should be `anymore`
 \bany more[,.]
 
+# Should be `Ask`
+(?:^|[.?]\s+)As\s+[A-Z][a-z]{2,}\s[^.?]*?(?:how|if|wh\w+)\b
+
+# Should be `at one fell swoop`
+# and only when talking about killing, not some other completion
+# Act 4 Scene 3, Macbeth
+# https://www.opensourceshakespeare.org/views/plays/play_view.php?WorkID=macbeth&Act=4&Scene=3&Scope=scene
+\bin one fell s[lw]?oop\b
+
 # Should be `'`
-(?i)\b(?:(?:i|s?he|they|what|who|you)"ll|(?:are|ca|did|do|does|ha[ds]|have|is|should|were|wo|would)n"t|(?:s?he|let|that|there|what|where|who)"s|(?:i|they|we|what|who|you)"ve)\b
+(?i)\b(?:(?:i|s?he|they|what|who|you)[`"]ll|(?:are|ca|did|do|does|ha[ds]|have|is|should|were|wo|would)n[`"]t|(?:s?he|let|that|there|what|where|who)[`"]s|(?:i|they|we|what|who|you)[`"]ve)\b
+
+# Should be `background` / `intro text` / `introduction` / `prologue` unless it's a brand or relates to _subterfuge_
+(?i)\bpretext\b
+
+# Should be `bearer`
+\b(?<=the )burden(?= of bad news\b)
+
+# Should be `branches`
+# ... unless it's really about the meal that replaces breakfast and lunch.
+\b[Bb]runches\b
 
 # Should be `briefcase`
 \bbrief-case\b
 
+# Should be `by far` or `far and away`
+\bby far and away\b
+
 # Should be `can, not only ..., ... also...`
 \bcan not only.*can also\b
 
@@ -46,7 +98,10 @@
 # > In formal writing and where contractions are frowned upon, use `cannot`.
 # > It is possible to write `can not`, but you generally find it only as part of some other construction, such as `not only . . . but also.`
 # - if you encounter such a case, add a pattern for that case to patterns.txt.
-\b[Cc]an not\b
+\b[Cc]an not\b(?! only\b)
+
+# Should be `chart`
+(?i)\bhelm\b.*\bchard\b
 
 # Do not use `(click) here` links
 # For more information, see:
@@ -56,9 +111,27 @@
 # * https://heyoka.medium.com/dont-use-click-here-f32f445d1021
 (?i)(?:>|\[)(?:(?:click |)here|link|(?:read |)more)(?:</|\]\()
 
+# Including "image of" or "picture of" in alt text is unnecessary.
+\balt=['"](?:an? |)(?:image|picture) of
+
+# Alt text should be short
+\balt=(?:'[^']{126,}'|"[^"]{126,}")
+
 # Should be `equals` to `is equal to`
 \bequals to\b
 
+# Should be `ECMA` 262 (JavaScript)
+(?i)\bTS\/EMCA\b|\bEMCA(?: \d|\s*Script)|\bEMCA\b(?=.*\bTS\b)
+
+# Should be `ECMA` 340 (Near Field Communications)
+(?i)EMCA[- ]340
+
+# Should be `fall back`
+(?<!\ba )(?<!\bthe )\bfallback(?= to(?! ask))\b
+
+# Should be `for`, `for, to` or `to`
+\b(?:for to|to for)\b
+
 # Should be `GitHub`
 (?<![&*.]|// |\b(?:from|import|type) )\bGithub\b(?![{()])
 
@@ -84,11 +157,14 @@
 # Should be `RabbitMQ`
 \bRabbitmq\b
 
+# Should be `TensorFlow`
+\bTensorflow\b
+
 # Should be `TypeScript`
 \bTypescript\b
 
 # Should be `another`
-\ban[- ]other\b
+\ban[- ]other(?!-)\b
 
 # Should be `case-(in)sensitive`
 \bcase (?:in|)sensitive\b
@@ -108,11 +184,14 @@
 # Should be `here-in`, `the`, `them`, `this`, `these` or reworded in some other way
 \bthe here(?:\.|,| (?!and|defined))
 
+# Should be `going to bed` or `going to a bad`
+\bgoing to bad(?!-)\b
+
 # Should be `greater than`
 #\bhigher than\b
 
-# Should be `ID`
-#\bId\b
+# Should be `ID` (unless it's a flag/property)
+#(?<![-\.])\bId\b(?![(])
 
 # Should be `in front of`
 \bin from of\b
@@ -125,6 +204,12 @@
 # Should be `use`
 \sin used by\b
 
+# Should be `in-depth` if used as an adjective (but `in depth` when used as an adverb)
+\bin depth\s(?!rather\b)\w{6,}
+
+# Should be `in-flight` or `on the fly` (unless actually talking about airline flights)
+\bon[- ]flight\b(?!=\s+(?:(?:\w{2}|)\d+|availability|booking|computer|data|delay|departure|management|performance|radar|reservation|scheduling|software|status|ticket|time|type|.*(?:hotel|taxi)))
+
 # Should be `is obsolete`
 \bis obsolescent\b
 
@@ -132,7 +217,10 @@
 \bits['’]
 
 # Should be `its`
-\bit's(?= own\b)
+\bit's(?= (?:child|only purpose|own(?:er|)|parent|sibling)\b)
+
+# Should be `for its` (possessive) or `because it is`
+\bfor it(?:'s| is)\b
 
 # Should be `log in`
 \blogin to the
@@ -140,6 +228,25 @@
 # Should be `long-standing`
 \blong standing\b
 
+# Should be `lose`
+(?<=\bwill )loose\b
+
+# `apt-key` is deprecated
+# ... instead you should be writing a pair of files:
+# ... * the gpg key added to a distinct key ring file based on your project/distro/key...
+# ... * the sources.list in a district file -- not simply appended to `/etc/apt/sources.list` -- (there is a newer format [DEB822](https://manpages.debian.org/bookworm/dpkg-dev/deb822.5.en.html)) that references the gpg key.
+# Consider:
+# ````sh
+# curl http://download.something.example.com/$DISTRO/Release.key | \
+#     gpg --dearmor --yes --output /usr/share/keyrings/something-distro.gpg
+# echo "deb [signed-by=/usr/share/keyrings/something-distro.gpg] http://download.something.example.com/repositories/home:/$DISTRO ./" \
+#     >> /etc/apt/sources.list.d/something-distro.list
+# ````
+\bapt-key add\b
+
+# Should be `nearby`
+\bnear by\b
+
 # Should probably be a person named `Nick` or the abbreviation `NIC`
 \bNic\b
 
@@ -153,7 +260,7 @@
 \bperform it's\b
 
 # Should be `opt-in`
-#(?<!\scan|for)(?<!\sif)\sopt in\s
+#(?<!\scan|for)(?<!\smust)(?<!\sif)\sopt in\s
 
 # Should be `less than`
 \bless then\b
@@ -170,24 +277,77 @@
 # Should be `on the other hand`
 \b(?i)on another hand\b
 
+# Reword to `on at runtime` or `enabled at launch`
+# The former if you mean it can be changed dynamically.
+# The latter if you mean that it can be changed without recompiling but not after the program starts.
+\bswitched on runtime\b
+
+# Should be `Of course,`
+[?.!]\s+Of course\s(?=[-\w\s]+[.?;!,])
+
 # Most people only have two hands. Reword.
 \b(?i)on the third hand\b
 
+# Should be `Open Graph`
+# unless talking about a specific Open Graph implementation:
+# - Java
+# - Node
+# - Py
+# - Ruby
+\bOpenGraph\b
+
+# Should be `OpenShift`
+\bOpenshift\b
+
 # Should be `otherwise`
 \bother[- ]wise\b
 
+# Should be `; otherwise` or `. Otherwise`
+# https://study.com/learn/lesson/otherwise-in-a-sentence.html
+, [Oo]therwise\b
+
+# Should probably be `Otherwise,`
+(?<=\. )Otherwise\s
+
 # Should be `or (more|less)`
 \bore (?:more|less)\b
 
+# Should be reworded.
+# `passthrough` is an adjective
+# `pass-through` could be a noun
+# `pass through` would be a verb phrase
+\b(?i)passthrough(?= an?\b)
+
 # Should be `rather than`
 \brather then\b
 
+# Should be `Red Hat`
+\bRed[Hh]at\b
+
 # Should be `regardless, ...` or `regardless of (whether)`
 \b[Rr]egardless if you\b
 
+# Should be `self-signed`
+\bself signed\b
+
+# Should be `SendGrid`
+\bSendgrid\b
+
+# Should be `set up` (`setup` is a noun / `set up` is a verb)
+\b[Ss]etup(?= (?:an?|the)\b)
+
+# Should be `state`
+\bsate(?=\b|[A-Z])|(?<=[a-z])Sate(?=\b|[A-Z])|(?<=[A-Z]{2})Sate(?=\b|[A-Z])
+
 # Should be `no longer needed`
 \bno more needed\b(?! than\b)
 
+# Should be `<see|look> below for the`
+(?i)\bfind below the\b
+
+# Should be `then any` unless there's a comparison before the `,`
+, than any\b
+
 # Should be `did not exist`
 \bwere not existent\b
 
@@ -197,9 +357,18 @@
 # Should be `nonexistent`
 \b[Nn]o[nt][- ]existent\b
 
+# Should be `our`
+\bspending out time\b
+
 # Should be `@brief` / `@details` / `@param` / `@return` / `@retval`
 (?:^\s*|(?:\*|//|/*)\s+`)[\\@](?:breif|(?:detail|detials)|(?:params(?!\.)|prama?)|ret(?:uns?)|retvl)\b
 
+# Should be `more than` or `more, then`
+\bmore then\b
+
+# Should be `Pipeline`/`pipeline`
+(?:(?<=\b|[A-Z])p|P)ipeLine(?:\b|(?=[A-Z]))
+
 # Should be `preexisting`
 [Pp]re[- ]existing
 
@@ -224,14 +393,27 @@
 # Should be `reentrant`
 [Rr]e[- ]entrant
 
+# Should be `room for`
+\brooms for (?!lease|rent|sale)
+
+# Should be `socioeconomic`
+# https://dictionary.cambridge.org/us/dictionary/english/socioeconomic
+socio-economic
+
 # Should be `strong suit`
 \b(?:my|his|her|their) strong suite\b
 
+# Should probably be `temperatures` unless actually talking about thermal drafts (things birds may fly on)
+\bthermals\b
+
+# Should be `there are` or `they are` (or `they're`)
+(?i)\btheir are\b
+
 # Should be `understand`
 \bunder stand\b
 
-# Should be `URI` or `uri` unless it refers to a person named `Uri`
-#(?<!\.)\bUri\b(?![(])
+# Should be `URI` or `uri` unless it refers to a person named `Uri` (or a flag)
+#(?<![-\.])\bUri\b(?![(])
 
 # Should be `it uses is`
 /\bis uses is\b/
@@ -245,12 +427,36 @@
 # Should be `where`
 \bwere they are\b
 
+# Should be `why`
+, way(?= is [^.]*\?)
+
 # should be `vCenter`
 \bV[Cc]enter\b
 
 # Should be `VM`
 \bVm\b
 
+# Should be `walkthrough(s)`
+\bwalk-throughs?\b
+
+# Should be `want`
+\bdon't ant\b
+
+# Should be `we'll`
+\bwe 'll\b
+
+# Should be `whereas`
+\bwhere as\b
+
+# Should be `WinGet`
+\bWinget\b
+
+# Should be `without` (unless `out` is a modifier of the next word)
+\bwith out\b(?!-)
+
+# Should be `work around`
+\b[Ww]orkaround(?= an?\b)
+
 # Should be `workarounds`
 #\bwork[- ]arounds\b
 
@@ -270,12 +476,12 @@
 \b(?:coarse|fine) grained\b
 
 # Homoglyph (Cyrillic) should be `A`/`B`/`C`/`E`/`H`/`I`/`I`/`J`/`K`/`M`/`O`/`P`/`S`/`T`/`Y`
-# It's possible that your content is intentionally mixing Cyrllic and Latin scripts, but if it isn't, you definitely want to correct this.
+# It's possible that your content is intentionally mixing Cyrillic and Latin scripts, but if it isn't, you definitely want to correct this.
 (?<=[A-Z]{2})[АВСЕНІӀЈКМОРЅТУ]|[АВСЕНІӀЈКМОРЅТУ](?=[A-Z]+(?:\b|[a-z]+)|[a-z]+(?:[^a-z]|$))
 
-# Homoglyph (Cyrillic) should be `a`/`b`/`e`
-# It's possible that your content is intentionally mixing Cyrllic and Latin scripts, but if it isn't, you definitely want to correct this.
-[аве](?=[A-Za-z]{2,})|(?<=[A-Za-z]{2})[аве]|(?<=[A-Za-z])[аве](?=[A-Za-z])
+# Homoglyph (Cyrillic) should be `a`/`b`/`c`/`e`/`o`/`p`/`x`/`y`
+# It's possible that your content is intentionally mixing Cyrillic and Latin scripts, but if it isn't, you definitely want to correct this.
+[авсеорху](?=[A-Za-z]{2,})|(?<=[A-Za-z]{2})[авсеорху]|(?<=[A-Za-z])[авсеорху](?=[A-Za-z])
 
 # Should be `neither/nor` -- or reword
 #(?!<do )\bnot\b([^.?!"/(](?!neither|,.*?,))+\bnor\b
diff --git a/.github/actions/spelling/patterns/patterns.txt b/.github/actions/spelling/patterns/patterns.txt
index e87815b5c4d..ca4ce83bebe 100644
--- a/.github/actions/spelling/patterns/patterns.txt
+++ b/.github/actions/spelling/patterns/patterns.txt
@@ -1,5 +1,35 @@
 # See https://github.com/check-spelling/check-spelling/wiki/Configuration-Examples:-patterns
 
+# Windows accelerators
+\b[A-Z][a-z]*&[a-z]+(?!;)\b
+
+# charsets.hpp
+\{ L.*\}, // (?:Cyrillic|Greek|Hebrew).*
+
+# Screen buffer tests
+\bQQ[A-Z]+\s*[A-Z]*Q+\b
+
+# Unicode references
+(?<=\W)(?:U\+?|)[0-9A-F]+b?\b
+
+# Verify
+VERIFY_IS_TRUE\(.*\)
+
+# TEST_METHOD(ApiScrollConsoleScreenBufferW)
+\bZ[A-Z]+$
+
+# TerminalApiTest
+stateMachine\.ProcessString\(L".*"
+
+# bundles
+[0-9a-z]+\\?\.msixbundle
+
+# text file names
+"[a-z]+\.txt"
+
+# Checksum
+L"[0-9A-F]{4}"
+
 # Direct 2D/3D
 \b(?:d[23]d(?=[a-z])|D[23]D(?=[A-Z]))
 
@@ -9,39 +39,127 @@
 # Windows Resources with accelerators
 \b[A-Z]&[a-z]+\b(?!;)
 
-# bug in check-spelling v0.0.24 (fixed later)
-\bok'd\b
-
 # Automatically suggested patterns
 
-# hit-count: 83 file-count: 18
+# hit-count: 3904 file-count: 577
+# IServiceProvider / isAThing
+(?:(?:\b|_|(?<=[a-z]))[IT]|(?:\b|_)(?:nsI|isA))(?=(?:[A-Z][a-z]{2,})+(?:[A-Z\d]|\b))
+
+# hit-count: 2437 file-count: 826
+# #includes
+^\s*#include\s*(?:<.*?>|".*?")
+
+# hit-count: 1131 file-count: 326
+# C# includes
+^\s*using [^;]+;
+
+# hit-count: 128 file-count: 47
 # C network byte conversions
 (?:\d|\bh)to(?!ken)(?=[a-z])|to(?=[adhiklpun]\()
 
-# hit-count: 59 file-count: 36
-# IServiceProvider / isAThing
-(?:\b|_)(?:(?:ns|)I|isA)(?=(?:[A-Z][a-z]{2,})+(?:[A-Z\d]|\b))
+# hit-count: 53 file-count: 10
+# ANSI color codes
+(?:\\(?:u00|x)1[Bb]|\\03[1-7]|\x1b|\\u\{1[Bb]\})\[\d+(?:;\d+)*m
 
-# hit-count: 9 file-count: 6
+# hit-count: 45 file-count: 29
+# version suffix <word>v#
+(?:(?<=[A-Z]{2})V|(?<=[a-z]{2}|[A-Z]{2})v)\d+(?:\b|(?=[a-zA-Z_]))
+
+# hit-count: 30 file-count: 19
+# uuid:
+\b[0-9a-fA-F]{8}-(?:[0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12}\b
+
+# hit-count: 17 file-count: 7
+# File extensions
+\*\.[+\w]+,
+
+# hit-count: 15 file-count: 9
 # Markdown anchor links
 \(#\S*?[a-zA-Z]\S*?\)
 
-# hit-count: 5 file-count: 5
-# libraries
-(?:\b|_)lib(?:re(?=office)|)(?!era[lt]|ero|ert(?:ies|y)|rar(?:i(?:an|es)|y))(?=[a-z])
+# hit-count: 14 file-count: 8
+# hex runs
+\b[0-9a-fA-F]{16,}\b
+
+# hit-count: 12 file-count: 8
+# hex digits including css/html color classes:
+(?:[\\0][xX]|\\u|[uU]\+|#x?|%23|&H)[0-9_a-fA-FgGrR]*?[a-fA-FgGrR]{2,}[0-9_a-fA-FgGrR]*(?:[uUlL]{0,3}|[iu]\d+)\b
+
+# hit-count: 12 file-count: 7
+# tar arguments
+\b(?:\\n|)g?tar(?:\.exe|)(?:(?:\s+--[-a-zA-Z]+|\s+-[a-zA-Z]+|\s[ABGJMOPRSUWZacdfh-pr-xz]+\b)(?:=[^ ]*|))+
+
+# hit-count: 9 file-count: 6
+# Repeated letters
+\b([a-z])\g{-1}{2,}\b
+
+# hit-count: 8 file-count: 2
+# regex choice
+\(\?:[^)]+\|[^)]+\)
+
+# hit-count: 8 file-count: 1
+# latex (check-spelling >= 0.0.22)
+\\\w{2,}\{
+
+# hit-count: 7 file-count: 4
+# Python string prefix / binary prefix
+# Note that there's a high false positive rate, remove the `?=` and search for the regex to see if the matches seem like reasonable strings
+(?<!['"])\b(?:B|BR|Br|F|FR|Fr|R|RB|RF|Rb|Rf|U|UR|Ur|b|bR|br|f|fR|fr|r|rB|rF|rb|rf|u|uR|ur)['"](?=[A-Z]{3,}|[A-Z][a-z]{2,}|[a-z]{3,})
+
+# hit-count: 5 file-count: 3
+# Alternatively, if you're using check-spelling v0.0.25+, and you would like to _check_ the Non-English content for spelling errors, you can. For information on how to do so, see:
+# https://docs.check-spelling.dev/Feature:-Configurable-word-characters.html#unicode
+[a-zA-Z]*[ÀÁÂÃÄÅÆČÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæčçèéêëìíîïðñòóôõöøùúûüýÿĀāŁłŃńŅņŒœŚśŠšŜŝŸŽžź][a-zA-Z]{3}[a-zA-ZÀÁÂÃÄÅÆČÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæčçèéêëìíîïðñòóôõöøùúûüýÿĀāŁłŃńŅņŒœŚśŠšŜŝŸŽžź]*|[a-zA-Z]{3,}[ÀÁÂÃÄÅÆČÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæčçèéêëìíîïðñòóôõöøùúûüýÿĀāŁłŃńŅņŒœŚśŠšŜŝŸŽžź]|[ÀÁÂÃÄÅÆČÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæčçèéêëìíîïðñòóôõöøùúûüýÿĀāŁłŃńŅņŒœŚśŠšŜŝŸŽžź][a-zA-Z]{3,}
 
 # hit-count: 3 file-count: 3
-# File extensions
-\*\.[+\w]+,
+# mailto urls
+mailto:[-a-zA-Z=;:/?%&0-9+@._]{3,}
+
+# hit-count: 2 file-count: 2
+# Alternative printf
+# %s
+%(?:s(?=[a-z]{2,}))(?!%)(?=[_a-zA-Z]+(?!%[^s])\b)(?=.*?['"])
 
 # hit-count: 2 file-count: 1
 # kubernetes crd patterns
 ^\s*pattern: .*$
 
+# hit-count: 1 file-count: 1
+# css fonts
+\bfont(?:-family|):[^;}]+
+
+# hit-count: 1 file-count: 1
+# microsoft
+\b(?:https?://|)(?:(?:(?:blogs|download\.visualstudio|docs|msdn2?|research)\.|)microsoft|blogs\.msdn)\.co(?:m|\.\w\w)/[-_a-zA-Z0-9()=./%]*
+
+# hit-count: 1 file-count: 1
+# Punycode
+\bxn--[-0-9a-z]+
+
+# hit-count: 1 file-count: 1
+# sha-... -- uses a fancy capture
+(\\?['"]|&quot;)[0-9a-f]{40,}\g{-1}
+
+# hit-count: 1 file-count: 1
+# Docker images
+^\s*(?i)FROM\s+\S+:\S+(?:\s+AS\s+\S+|)
+
+# hit-count: 1 file-count: 1
+# WWNN/WWPN (NAA identifiers)
+\b(?:0x)?10[0-9a-f]{14}\b|\b(?:0x|3)?[25][0-9a-f]{15}\b|\b(?:0x|3)?6[0-9a-f]{31}\b
+
 # hit-count: 1 file-count: 1
 # curl arguments
 \b(?:\\n|)curl(?:\.exe|)(?:\s+-[a-zA-Z]{1,2}\b)*(?:\s+-[a-zA-Z]{3,})(?:\s+-[a-zA-Z]+)*
 
+# hit-count: 1 file-count: 1
+# tput arguments -- https://man7.org/linux/man-pages/man5/terminfo.5.html -- technically they can be more than 5 chars long...
+\btput\s+(?:(?:-[SV]|-T\s*\w+)\s+)*\w{3,5}\b
+
+# bug in check-spelling v0.0.24 (fixed later)
+\bok'd\b
+
+
 https?://\S+
 [Pp]ublicKeyToken="?[0-9a-fA-F]{16}"?
 (?:[{"]|UniqueIdentifier>)[0-9a-fA-F]{8}-(?:[0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12}(?:[}"]|</UniqueIdentifier)
@@ -72,24 +190,11 @@ ROY\sG\.\sBIV
 # ARM NEON intrinsics like "vsubq_u16"
 \bv\w+_[fsu](?:8|16|32|64)\b
 
-# color floating numbers
-0x[0-9a-f](?:\.[0-9a-f]*p)[-+]\d+f
-
 # AppX package
 _\d[0-9a-z]{12}['\.]
 
 # string test
 equals_insensitive_ascii\("\w+", "\w+"
-
-# Automatically suggested patterns
-# hit-count: 3788 file-count: 599
-# IServiceProvider / isAThing
-\b(?:I|isA)(?=(?:[A-Z][a-z]{2,})+\b)
-
-# hit-count: 314 file-count: 21
-# hex runs
-\b[0-9a-fA-F]{16,}\b
-
 # hit-count: 47 file-count: 11
 # special cased printf markers
 \\r\\n(?=[a-z])|(?<!\\)\\[nrt](?=[a-z]{2,})(?=.*(?:<.*['"`]|"(?:[;,]|\);)$|\) \+$))
@@ -97,92 +202,18 @@ equals_insensitive_ascii\("\w+", "\w+"
 # ConsoleArgumentsTests
 --headless\\.*?"
 
-# hit-count: 109 file-count: 62
-# Compiler flags (Unix, Java/Scala)
-# Use if you have things like `-Pdocker` and want to treat them as `docker`
-(?:^|[\t ,>"'`=(])-(?:D(?=[A-Z])|W(?!ork)|X|f(?=[ms]))(?=[A-Z]{2,}|[A-Z][a-z]|[a-z]{2,})
-
-# hit-count: 60 file-count: 35
-# version suffix <word>v#
-(?:(?<=[A-Z]{2})V|(?<=[a-z]{2}|[A-Z]{2})v)\d+(?:\b|(?=[a-zA-Z_]))
-
-# hit-count: 2 file-count: 2
-# This does not cover multiline strings, if your repository has them,
-# you'll want to remove the `(?=.*?")` suffix.
-# The `(?=.*?")` suffix should limit the false positives rate
-# printf
-%(?:s)(?!ize)(?=[a-z]{2,})
-
-# hit-count: 16 file-count: 10
-# uuid:
-\b[0-9a-fA-F]{8}-(?:[0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12}\b
-
-# hit-count: 13 file-count: 4
-# Non-English
-[a-zA-Z]*[ÀÁÂÃÄÅÆČÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæčçèéêëìíîïðñòóôõöøùúûüýÿĀāŁłŃńŅņŒœŚśŠšŜŝŸŽžź][a-zA-Z]{3}[a-zA-ZÀÁÂÃÄÅÆČÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæčçèéêëìíîïðñòóôõöøùúûüýÿĀāŁłŃńŅņŒœŚśŠšŜŝŸŽžź]*|[a-zA-Z]{3,}[ÀÁÂÃÄÅÆČÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæčçèéêëìíîïðñòóôõöøùúûüýÿĀāŁłŃńŅņŒœŚśŠšŜŝŸŽžź]|[ÀÁÂÃÄÅÆČÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæčçèéêëìíîïðñòóôõöøùúûüýÿĀāŁłŃńŅņŒœŚśŠšŜŝŸŽžź][a-zA-Z]{3,}
-
-# hit-count: 7 file-count: 5
-# hex digits including css/html color classes:
-(?:[\\0][xX]|\\u|[uU]\+|#x?|\%23)[0-9_a-fA-FgGrR]*?[a-fA-FgGrR]{2,}[0-9_a-fA-FgGrR]*(?:[uUlL]{0,3}|[iu]\d+)\b
-
-# hit-count: 7 file-count: 1
-# regex choice
-\(\?:[^)]+\|[^)]+\)
-
-# hit-count: 4 file-count: 4
-# tar arguments
-\b(?:\\n|)g?tar(?:\.exe|)(?:(?:\s+--[-a-zA-Z]+|\s+-[a-zA-Z]+|\s[ABGJMOPRSUWZacdfh-pr-xz]+\b)(?:=[^ ]*|))+
-
-# hit-count: 4 file-count: 1
-# ANSI color codes
-(?:\\(?:u00|x)1[Bb]|\x1b|\\u\{1[Bb]\})\[\d+(?:;\d+|)m
-
-# hit-count: 4 file-count: 1
-# Update Lorem based on your content (requires `ge` and `w` from https://github.com/jsoref/spelling; and `review` from https://github.com/check-spelling/check-spelling/wiki/Looking-for-items-locally )
-# grep '^[^#].*lorem' .github/actions/spelling/patterns.txt|perl -pne 's/.*i..\?://;s/\).*//' |tr '|' "\n"|sort -f |xargs -n1 ge|perl -pne 's/^[^:]*://'|sort -u|w|sed -e 's/ .*//'|w|review -
-# Warning, while `(?i)` is very neat and fancy, if you have some binary files that aren't proper unicode, you might run into:
-## Operation "substitution (s///)" returns its argument for non-Unicode code point 0x1C19AE (the code point will vary).
-## You could manually change `(?i)X...` to use `[Xx]...`
-## or you could add the files to your `excludes` file (a version after 0.0.19 should identify the file path)
-# Lorem
-(?:\w|\s|[,.])*\b(?i)(?:amet|consectetur|cursus|dolor|eros|ipsum|lacus|libero|ligula|lorem|magna|neque|nulla|suscipit|tempus)\b(?:\w|\s|[,.])*
-
-# hit-count: 3 file-count: 3
-# mailto urls
-mailto:[-a-zA-Z=;:/?%&0-9+@.]{3,}
-
-# hit-count: 2 file-count: 1
-# Python string prefix / binary prefix
-# Note that there's a high false positive rate, remove the `?=` and search for the regex to see if the matches seem like reasonable strings
-(?<!')\b(?:B|BR|Br|F|FR|Fr|R|RB|RF|Rb|Rf|U|UR|Ur|b|bR|br|f|fR|fr|r|rB|rF|rb|rf|u|uR|ur)'(?=[A-Z]{3,}|[A-Z][a-z]{2,}|[a-z]{3,})
-
-# hit-count: 1 file-count: 1
-# Punycode
-\bxn--[-0-9a-z]+
-
-# hit-count: 1 file-count: 1
-# latex (check-spelling >= 0.0.22)
-\\\w{2,}\{
-
-# hit-count: 1 file-count: 1
-# tput arguments -- https://man7.org/linux/man-pages/man5/terminfo.5.html -- technically they can be more than 5 chars long...
-\btput\s+(?:(?:-[SV]|-T\s*\w+)\s+)*\w{3,5}\b
 
 # Questionably acceptable forms of `in to`
 # Personally, I prefer `log into`, but people object
 # https://www.tprteaching.com/log-into-log-in-to-login/
-\b(?:[Ll]og|[Ss]ign) in to\b
+\b(?:(?:[Ll]og(?:g(?=[a-z])|)|[Ss]ign)(?:ed|ing)?) in to\b
 
 # to opt in
 \bto opt in\b
 
-# Questionably acceptable forms of `in to`
-# Personally, I prefer `log into`, but people object
-# https://www.tprteaching.com/log-into-log-in-to-login/
-\b(?:(?:[Ll]og(?:g(?=[a-z])|)|[Ss]ign)(?:ed|ing)?) in to\b
+# pass(ed|ing) in
+\bpass(?:ed|ing) in\b
 
-# to opt in
-\bto opt in\b
 # acceptable duplicates
 # ls directory listings
 [-bcdlpsw](?:[-r][-w][-SsTtx]){3}[\.+*]?\s+\d+\s+\S+\s+\S+\s+[.\d]+(?:[KMGT]|)\s+
diff --git a/.github/actions/spelling/reject.txt b/.github/actions/spelling/reject.txt
index d98038f96f9..a4022cd4b4a 100644
--- a/.github/actions/spelling/reject.txt
+++ b/.github/actions/spelling/reject.txt
@@ -1,10 +1,19 @@
 ^attache$
 ^attacher$
 ^attachers$
-^bellow$
+^bellow?$
 benefitting
 occurences?
 ^dependan.*
+^develope$
+^developement$
+^developpe
+^Devers?$
+^devex
+^devide
+^Devinn?[ae]
+^devisal
+^devisor
 ^diables?$
 ^oer$
 Sorce
@@ -12,4 +21,5 @@ Sorce
 ^Teh$
 ^untill$
 ^untilling$
+^venders?$
 ^wether.*
diff --git a/.github/workflows/spelling2.yml b/.github/workflows/spelling2.yml
index 7675d5d004e..f01ac1eea50 100644
--- a/.github/workflows/spelling2.yml
+++ b/.github/workflows/spelling2.yml
@@ -93,7 +93,7 @@ jobs:
     steps:
       - name: check-spelling
         id: spelling
-        uses: check-spelling/check-spelling@v0.0.24
+        uses: check-spelling/check-spelling@v0.0.25
         with:
           suppress_push_for_open_pull_request: ${{ github.actor != 'dependabot[bot]' && 1 }}
           checkout: true
@@ -114,34 +114,33 @@ jobs:
             cspell:software-terms/softwareTerms.txt
             cspell:cpp/stdlib-cpp.txt
             cspell:cpp/stdlib-c.txt
-            cspell:lorem-ipsum/dictionary.txt
+            cspell:python/python/python-lib.txt
             cspell:php/php.txt
+            cspell:node/node.txt
+            cspell:dart/dart.txt
             cspell:filetypes/filetypes.txt
             cspell:java/java.txt
-            cspell:node/node.txt
-            cspell:golang/go.txt
-            cspell:java/java-terms.txt
-            cspell:mnemonics/mnemonics.txt
+            cspell:css/css.txt
+            cspell:dotnet/dotnet.txt
             cspell:npm/npm.txt
             cspell:fullstack/fullstack.txt
-            cspell:python/python/python-lib.txt
-            cspell:dotnet/dotnet.txt
-            cspell:dart/dart.txt
-            cspell:aws/aws.txt
-            cspell:python/common/extra.txt
-            cspell:css/css.txt
+            cspell:java/java-terms.txt
+            cspell:r/r.txt
+            cspell:golang/go.txt
             cspell:cpp/stdlib-cmath.txt
             cspell:typescript/typescript.txt
+            cspell:html/html.txt
             cspell:cpp/compiler-msvc.txt
             cspell:django/django.txt
-            cspell:html/html.txt
-            cspell:cpp/lang-keywords.txt
+            cspell:aws/aws.txt
+            cspell:python/common/extra.txt
             cspell:cpp/ecosystem.txt
-            cspell:r/r.txt
-            cspell:cpp/compiler-clang-attributes.txt
-            cspell:powershell/powershell.txt
+            cspell:cpp/lang-keywords.txt
             cspell:csharp/csharp.txt
+            cspell:cpp/compiler-clang-attributes.txt
             cspell:python/python/python.txt
+            cspell:mnemonics/mnemonics.txt
+            cspell:powershell/powershell.txt
 
   comment-push:
     name: Report (Push)
@@ -154,7 +153,7 @@ jobs:
     if: (success() || failure()) && needs.spelling.outputs.followup && github.event_name == 'push'
     steps:
       - name: comment
-        uses: check-spelling/check-spelling@v0.0.24
+        uses: check-spelling/check-spelling@v0.0.25
         with:
           checkout: true
           spell_check_this: microsoft/terminal@main
@@ -172,7 +171,7 @@ jobs:
     if: (success() || failure()) && needs.spelling.outputs.followup && contains(github.event_name, 'pull_request')
     steps:
       - name: comment
-        uses: check-spelling/check-spelling@v0.0.24
+        uses: check-spelling/check-spelling@v0.0.25
         with:
           checkout: true
           spell_check_this: microsoft/terminal@main
@@ -198,7 +197,7 @@ jobs:
       cancel-in-progress: false
     steps:
       - name: apply spelling updates
-        uses: check-spelling/check-spelling@v0.0.24
+        uses: check-spelling/check-spelling@v0.0.25
         with:
           experimental_apply_changes_via_bot: ${{ github.repository_owner != 'microsoft' && 1 }}
           checkout: true
diff --git a/.github/workflows/winget.yml b/.github/workflows/winget.yml
index 5dda1dc89c3..4adf3837b15 100644
--- a/.github/workflows/winget.yml
+++ b/.github/workflows/winget.yml
@@ -1,4 +1,4 @@
-name: Publish to Winget
+name: Publish to WinGet
 
 on:
   release:
diff --git a/build/Helix/HelixTestHelpers.cs b/build/Helix/HelixTestHelpers.cs
index 67f13937c08..cb8591031ed 100644
--- a/build/Helix/HelixTestHelpers.cs
+++ b/build/Helix/HelixTestHelpers.cs
@@ -28,7 +28,7 @@ public TestResult()
         public List<string> Screenshots { get; private set; }
         public List<TestResult> RerunResults { get; private set; }
     }
-    
+
     //
     // Azure DevOps doesn't currently provide a way to directly report sub-results for tests that failed at least once
     // that were run multiple times.  To get around that limitation, we'll mark the test as "Skip" since
@@ -49,46 +49,46 @@ public TestResult()
     // TODO (https://github.com/dotnet/arcade/issues/2773): Once we're able to directly report things in a
     // more granular fashion than just a binary pass/fail result, we should do that.
     //
-    [DataContract]  
+    [DataContract]
     internal class JsonSerializableTestResults
-    {  
+    {
         [DataMember]
         internal string blobPrefix;
-        
+
         [DataMember]
         internal string blobSuffix;
-        
+
         [DataMember]
         internal string[] errors;
-        
+
         [DataMember]
         internal JsonSerializableTestResult[] results;
     }
-    
-    [DataContract]  
-    internal class JsonSerializableTestResult  
+
+    [DataContract]
+    internal class JsonSerializableTestResult
     {
         [DataMember]
         internal string outcome;
 
         [DataMember]
         internal int duration;
-        
+
         [DataMember(EmitDefaultValue = false)]
         internal string log;
-        
+
         [DataMember(EmitDefaultValue = false)]
         internal string[] screenshots;
-        
+
         [DataMember(EmitDefaultValue = false)]
         internal int errorIndex;
     }
-    
+
     public class TestPass
     {
         public TimeSpan TestPassExecutionTime { get; set; }
         public List<TestResult> TestResults { get; set; }
-        
+
         public static TestPass ParseTestWttFile(string fileName, bool cleanupFailuresAreRegressions, bool truncateTestNames)
         {
             using (var stream = File.OpenRead(fileName))
@@ -174,7 +174,7 @@ public static TestPass ParseTestWttFile(string fileName, bool cleanupFailuresAre
                         if (testsExecuting == 1)
                         {
                             string testName = element.Attribute("Title").Value;
-                            
+
                             if (truncateTestNames)
                             {
                                 const string xamlNativePrefix = "Windows::UI::Xaml::Tests::";
@@ -243,7 +243,7 @@ public static TestPass ParseTestWttFile(string fileName, bool cleanupFailuresAre
 
 
                         // The test cleanup errors will often come after the test claimed to have
-                        // 'passed'. We treat them as errors as well. 
+                        // 'passed'. We treat them as errors as well.
                         if (inTestCleanup)
                         {
                             currentResult.CleanupPassed = false;
@@ -292,7 +292,7 @@ public static TestPass ParseTestWttFile(string fileName, bool cleanupFailuresAre
                                 foreach(var screenshot in screenshots)
                                 {
                                     string fileNameSuffix = string.Empty;
-                                    
+
                                     if (fileName.Contains("_rerun_multiple"))
                                     {
                                         fileNameSuffix = "_rerun_multiple";
@@ -301,7 +301,7 @@ public static TestPass ParseTestWttFile(string fileName, bool cleanupFailuresAre
                                     {
                                         fileNameSuffix = "_rerun";
                                     }
-                                    
+
                                     currentResult.Screenshots.Add(screenshot.Replace(".jpg", fileNameSuffix + ".jpg"));
                                 }
                             }
@@ -313,7 +313,7 @@ public static TestPass ParseTestWttFile(string fileName, bool cleanupFailuresAre
                 testPassStopTime = Int64.Parse(doc.Root.Descendants("WexTraceInfo").Last().Attribute("TimeStamp").Value);
 
                 var testPassTime = TimeSpan.FromSeconds((double)(testPassStopTime - testPassStartTime) / frequency);
-                
+
                 foreach (TestResult testResult in testResults)
                 {
                     if (testResult.Details != null)
@@ -331,13 +331,13 @@ public static TestPass ParseTestWttFile(string fileName, bool cleanupFailuresAre
                 return testpass;
             }
         }
-        
+
         public static TestPass ParseTestWttFileWithReruns(string fileName, string singleRerunFileName, string multipleRerunFileName, bool cleanupFailuresAreRegressions, bool truncateTestNames)
         {
             TestPass testPass = ParseTestWttFile(fileName, cleanupFailuresAreRegressions, truncateTestNames);
             TestPass singleRerunTestPass = File.Exists(singleRerunFileName) ? ParseTestWttFile(singleRerunFileName, cleanupFailuresAreRegressions, truncateTestNames) : null;
             TestPass multipleRerunTestPass = File.Exists(multipleRerunFileName) ? ParseTestWttFile(multipleRerunFileName, cleanupFailuresAreRegressions, truncateTestNames) : null;
-            
+
             List<TestResult> rerunTestResults = new List<TestResult>();
 
             if (singleRerunTestPass != null)
@@ -377,9 +377,9 @@ public static class FailedTestDetector
         public static void OutputFailedTestQuery(string wttInputPath)
         {
             var testPass = TestPass.ParseTestWttFile(wttInputPath, cleanupFailuresAreRegressions: true, truncateTestNames: false);
-            
+
             List<string> failedTestNames = new List<string>();
-            
+
             foreach (var result in testPass.TestResults)
             {
                 if (!result.Passed)
@@ -387,23 +387,23 @@ public static void OutputFailedTestQuery(string wttInputPath)
                     failedTestNames.Add(result.Name);
                 }
             }
-            
+
             if (failedTestNames.Count > 0)
             {
                 string failedTestSelectQuery = "(@Name='";
-                
+
                 for (int i = 0; i < failedTestNames.Count; i++)
                 {
                     failedTestSelectQuery += failedTestNames[i];
-                    
+
                     if (i < failedTestNames.Count - 1)
                     {
                         failedTestSelectQuery += "' or @Name='";
                     }
                 }
-                
+
                 failedTestSelectQuery += "')";
-            
+
                 Console.WriteLine(failedTestSelectQuery);
             }
             else
@@ -418,7 +418,7 @@ public class TestResultParser
         private string testNamePrefix;
         private string helixResultsContainerUri;
         private string helixResultsContainerRsas;
-    
+
         public TestResultParser(string testNamePrefix, string helixResultsContainerUri, string helixResultsContainerRsas)
         {
             this.testNamePrefix = testNamePrefix;
@@ -430,7 +430,7 @@ public Dictionary<string, string> GetSubResultsJsonByMethodName(string wttInputP
         {
             Dictionary<string, string> subResultsJsonByMethod = new Dictionary<string, string>();
             TestPass testPass = TestPass.ParseTestWttFileWithReruns(wttInputPath, wttSingleRerunInputPath, wttMultipleRerunInputPath, cleanupFailuresAreRegressions: true, truncateTestNames: false);
-            
+
             foreach (var result in testPass.TestResults)
             {
                 var methodName = result.Name.Substring(result.Name.LastIndexOf('.') + 1);
@@ -488,7 +488,7 @@ public void ConvertWttLogToXUnitLog(string wttInputPath, string wttSingleRerunIn
 
             int resultCount = results.Count;
             int passedCount = results.Where(r => r.Passed).Count();
-            
+
             // Since we re-run tests on failure, we'll mark every test that failed at least once as "skipped" rather than "failed".
             // If the test failed sufficiently often enough for it to count as a failed test (determined by a property on the
             // Azure DevOps job), we'll later mark it as failed during test results processing.
@@ -504,15 +504,15 @@ public void ConvertWttLogToXUnitLog(string wttInputPath, string wttSingleRerunIn
             assembly.SetAttributeValue("run-date", DateTime.Now.ToString("yyyy-MM-dd"));
 
             // This doesn't need to be completely accurate since it's not exposed anywhere.
-            // If we need accurate an start time we can probably calculate it from the te.wtl file, but for
+            // If we need an accurate start time we can probably calculate it from the te.wtl file, but for
             // now this is fine.
             assembly.SetAttributeValue("run-time", (DateTime.Now - testPass.TestPassExecutionTime).ToString("hh:mm:ss"));
-            
+
             assembly.SetAttributeValue("total", resultCount);
             assembly.SetAttributeValue("passed", passedCount);
             assembly.SetAttributeValue("failed", failedCount);
             assembly.SetAttributeValue("skipped", skippedCount);
-            
+
             assembly.SetAttributeValue("time", (int)testPass.TestPassExecutionTime.TotalSeconds);
             assembly.SetAttributeValue("errors", 0);
             root.Add(assembly);
@@ -537,9 +537,9 @@ public void ConvertWttLogToXUnitLog(string wttInputPath, string wttSingleRerunIn
                 test.SetAttributeValue("method", methodName);
 
                 test.SetAttributeValue("time", result.ExecutionTime.TotalSeconds);
-                
+
                 string resultString = string.Empty;
-                
+
                 if (result.Passed && !result.Skipped)
                 {
                     resultString = "Pass";
@@ -554,7 +554,7 @@ public void ConvertWttLogToXUnitLog(string wttInputPath, string wttSingleRerunIn
                     resultString = "Fail";
                 }
 
-                
+
                 if (!result.Passed)
                 {
                     if (result.Skipped)
@@ -579,36 +579,36 @@ public void ConvertWttLogToXUnitLog(string wttInputPath, string wttSingleRerunIn
 
             File.WriteAllText(xunitOutputPath, root.ToString());
         }
-        
+
         private JsonSerializableTestResult ConvertToSerializableResult(TestResult rerunResult, string[] uniqueErrors)
         {
             var serializableResult = new JsonSerializableTestResult();
-            
+
             serializableResult.outcome = rerunResult.Passed ? "Passed" : "Failed";
             serializableResult.duration = (int)Math.Round(rerunResult.ExecutionTime.TotalMilliseconds);
-            
+
             if (!rerunResult.Passed)
             {
                 serializableResult.log = Path.GetFileName(rerunResult.SourceWttFile);
-                
+
                 if (rerunResult.Screenshots.Any())
                 {
                     List<string> screenshots = new List<string>();
-                    
+
                     foreach (var screenshot in rerunResult.Screenshots)
                     {
                         screenshots.Add(Path.GetFileName(screenshot));
                     }
-                    
+
                     serializableResult.screenshots = screenshots.ToArray();
                 }
-                
+
                 // To conserve space, we'll log the index of the error to index in a list of unique errors rather than
                 // jotting down every single error in its entirety. We'll add one to the result so we can avoid
                 // serializing this property when it has the default value of 0.
                 serializableResult.errorIndex = Array.IndexOf(uniqueErrors, rerunResult.Details) + 1;
             }
-            
+
             return serializableResult;
         }
 
@@ -617,7 +617,7 @@ private string GetUploadedFileUrl(string filePath, string helixResultsContainerU
             var filename = Path.GetFileName(filePath);
             return string.Format("{0}/{1}{2}", helixResultsContainerUri, filename, helixResultsContainerRsas);
         }
-		
+
 		private string GetTestNameSeparator(string testname)
         {
             var separatorString = ".";
diff --git a/build/pipelines/templates-v2/job-pgo-build-nuget-and-publish.yml b/build/pipelines/templates-v2/job-pgo-build-nuget-and-publish.yml
index e30e23b88c4..513e5c50076 100644
--- a/build/pipelines/templates-v2/job-pgo-build-nuget-and-publish.yml
+++ b/build/pipelines/templates-v2/job-pgo-build-nuget-and-publish.yml
@@ -30,7 +30,7 @@ jobs:
   steps:
   - checkout: self
     clean: true
-    # It is important that this be 0, otherwise git will not fetch the branch ref names that the PGO rules require.
+    # It is important that this be 0; otherwise, git will not fetch the branch ref names that the PGO rules require.
     fetchDepth: 0
     submodules: false
     persistCredentials: false
diff --git a/doc/Niksa.md b/doc/Niksa.md
index ec6af1f1463..d9d82fe39dd 100644
--- a/doc/Niksa.md
+++ b/doc/Niksa.md
@@ -15,7 +15,7 @@ This document serves as a storage point for those posts.
 ## <a name="cmd"></a>Why do we avoid changing CMD.exe?
 `setlocal` doesn't behave the same way as an environment variable. It's a thing that would have to be put in at the top of the batch script that is `somefile.cmd` as one of its first commands to adjust the way that one specific batch file is processed by the `cmd.exe` engine. That's probably not suitable for your needs, but that's the way we have to go.
 
-I don't think anyone is disagreeing with you, @mikemaccana, that this would be a five minute development change to read that environment variable and change the behavior of `cmd.exe`. It absolutely would be a tiny development time. 
+I don't think anyone is disagreeing with you, @mikemaccana, that this would be a five minute development change to read that environment variable and change the behavior of `cmd.exe`. It absolutely would be a tiny development time.
 
 It's just that from our experience, we know there's going to be a 3-24 month bug tail here where we get massive investigation callbacks by some billion dollar enterprise customer who for whatever reason was already using the environment variable we pick for another purpose. Their script that they give their rank-and-file folks will tell them to press Ctrl+C at some point in the batch script to do whatever happens, it will do something different, those people will notice the script doesn't match the computer anymore. They will then halt the production line and tell their supervisor. The supervisor tells some director. Their director comes screaming at their Microsoft enterprise support contract person that we've introduced a change to the OS that is costing them millions if not billions of dollars in shipments per month. Our directors at Microsoft then come bashing down our doors angry with us and make us fix it ASAP or revert it, we don't get to go home at 5pm to our families or friends because we're fixing it, we get stressed the heck out, we have to spin up servicing potentially for already shipped operating systems which is expensive and headache-causing...etc.
 
@@ -27,7 +27,7 @@ I would highly recommend that Gulp convert to using PowerShell scripts and that
 
 Original Source: https://github.com/microsoft/terminal/issues/217#issuecomment-404240443
 
-_Addendum_: cmd.exe is the literal embodiment of [xkcd#1172]([url](https://xkcd.com/1172/)). Every change, no matter how small, will break _someone_. 
+_Addendum_: cmd.exe is the literal embodiment of [xkcd#1172]([url](https://xkcd.com/1172/)). Every change, no matter how small, will break _someone_.
 
 ## <a name="screenPerf"></a>Why is typing-to-screen performance better than every other app?
 
@@ -37,33 +37,33 @@ Also, I'm happy to discuss this with you until you're utterly sick of reading it
 
 If I had to take an educated guess as to what is making us faster than pretty much any other application on Windows at putting your text on the screen... I would say it is because that is literally our only job! Also probably because we are using darn near the oldest and lowest level APIs that Windows has to accomplish this work.
 
-Pretty much everything else you've listed has some sort of layer or framework involved, or many, many layers and frameworks, when you start talking about Electron and JavaScript. We don't. 
+Pretty much everything else you've listed has some sort of layer or framework involved, or many, many layers and frameworks, when you start talking about Electron and JavaScript. We don't.
 
-We have one bare, super un-special window with no additional controls attached to it. We get our keys fed into us from just barely above the kernel given that we're processing them from window messages and not from some sort of eventing framework common to pretty much any other more complicated UI framework than ours (WPF, WinForms, UWP, Electron). And we dump our text straight onto the window surface using GDI's [PolyTextOut](https://docs.microsoft.com/en-us/windows/desktop/api/wingdi/nf-wingdi-polytextoutw) with no frills. 
+We have one bare, super un-special window with no additional controls attached to it. We get our keys fed into us from just barely above the kernel given that we're processing them from window messages and not from some sort of eventing framework common to pretty much any other more complicated UI framework than ours (WPF, WinForms, UWP, Electron). And we dump our text straight onto the window surface using GDI's [PolyTextOut](https://docs.microsoft.com/en-us/windows/desktop/api/wingdi/nf-wingdi-polytextoutw) with no frills.
 
 Even `notepad.exe` has multiple controls on its window at the very least and is probably (I haven't looked) using some sort of library framework in the edit control to figure out its text layout (which probably is using another library framework for internationalization support...)
 
-Of course this also means that we have trade offs. We don't support fully international text like pretty much every other application will. RTL? No go zone right now. Surrogate pairs and emoji? We're getting there but not there yet. Indic scripts? Nope. 
+Of course this also means that we have trade offs. We don't support fully international text like pretty much every other application will. RTL? No go zone right now. Surrogate pairs and emoji? We're getting there but not there yet. Indic scripts? Nope.
 
 Why are we like this? For one, `conhost.exe` is old as dirt. It has to use the bare metal bottom layer of everything because it was created before most of those other frameworks were created. And also it maintains as low/bottom level as possible because it is pretty much the first thing that one needs to bring up when bringing up a new operating system edition or device before you have all the nice things like frameworks or what those frameworks require to operate. Also it's written in C/C++ which is about as low and bare metal as we can get.
 
-Will this UI enhancement come to other apps on Windows? Almost certainly not. They have too much going on which is both a good and a bad thing. I'm jealous of their ability to just call one method and layout text in an uncomplicated manner in any language without manually calculating pixels or caring about what styles apply to their font. But my manual pixel calculations, dirty region math, scroll region madness, and more makes it so we go faster than them. I'm also jealous that when someone says "hey can you add a status bar to the bottom of your window" that they can pretty much click and drag that into place with their UI Framework and it will just work where as for us, it's been a backlog item forever and gives me heartburn to think about implementing. 
+Will this UI enhancement come to other apps on Windows? Almost certainly not. They have too much going on which is both a good and a bad thing. I'm jealous of their ability to just call one method and layout text in an uncomplicated manner in any language without manually calculating pixels or caring about what styles apply to their font. But my manual pixel calculations, dirty region math, scroll region madness, and more makes it so we go faster than them. I'm also jealous that when someone says "hey can you add a status bar to the bottom of your window" that they can pretty much click and drag that into place with their UI Framework and it will just work whereas for us, it's been a backlog item forever and gives me heartburn to think about implementing.
 
-Will we try to keep it from regressing? Yes! Right now it's sort of a manual process. We identify that something is getting slow and then we go haul out [WPR](https://docs.microsoft.com/en-us/windows-hardware/test/wpt/windows-performance-recorder) and start taking traces. We stare down the hot paths and try to reason out what is going on and then improve them. For instance, in the last cycle or two, we focused on heap allocations as a major area where we could improve our end-to-end performance, changing a ton of our code to use stack-constructed iterator-like facades over the underlying request buffer instead of translating and allocating it into a new heap space for each level of processing. 
+Will we try to keep it from regressing? Yes! Right now it's sort of a manual process. We identify that something is getting slow and then we go haul out [WPR](https://docs.microsoft.com/en-us/windows-hardware/test/wpt/windows-performance-recorder) and start taking traces. We stare down the hot paths and try to reason out what is going on and then improve them. For instance, in the last cycle or two, we focused on heap allocations as a major area where we could improve our end-to-end performance, changing a ton of our code to use stack-constructed iterator-like facades over the underlying request buffer instead of translating and allocating it into a new heap space for each level of processing.
 
 As an aside, @bitcrazed wants us to automate performance tests in some conhost specific way, but I haven't quite figured out a controlled environment to do this in yet. The Windows Engineering System runs performance tests each night that give us a coarse-grained way of knowing if we messed something up for the whole operating system, and they technically offer a fine-grained way for us to insert our own performance tests... but I just haven't got around to that yet. If you have an idea for a way for us to do this in an automated fashion, I'm all ears.
 
-If there's anything else you'd like to know, let me know. I could go on all day. I deleted like 15 tangents from this reply before posting it.... 
+If there's anything else you'd like to know, let me know. I could go on all day. I deleted like 15 tangents from this reply before posting it....
 
 Original Source: https://github.com/microsoft/terminal/issues/327#issuecomment-447391705
 
 ## <a name="gfxMsgStack"></a>How are the Windows graphics/messaging stack assembled?
 
-@stakx, I am referring to USER32 and GDI32. 
+@stakx, I am referring to USER32 and GDI32.
 
 I'll give you a cursory overview of what I know off the top of my head without spending hours confirming the details. As such, some of this is subject to handwaving and could be mildly incorrect but is probably in the right direction. Consider every statement to be my personal knowledge on how the world works and subject to opinion or error.
 
-For the graphics part of the pipeline (GDI32), the user-mode portions of GDI are pretty far down. The app calls GDI32, some work is done in that DLL on the user-mode side, then a kernel call jumps over to the kernel and drawing occurs. 
+For the graphics part of the pipeline (GDI32), the user-mode portions of GDI are pretty far down. The app calls GDI32, some work is done in that DLL on the user-mode side, then a kernel call jumps over to the kernel and drawing occurs.
 
 The portion that you're thinking of regarding "silently converted to sit on top of other stuff" is probably that once we hit the kernel calls, a bunch of the kernel GDI stuff tends to be re-platformed on top of the same stuff as DirectX when it is actually handled by the NVIDIA/AMD/Intel/etc. graphics driver and the GPU at the bottom of the stack. I think this happened with the graphics driver re-architecture that came as a part of WDDM for Windows Vista. There's a document out there somewhere about what calls are still really fast in GDI and which are slower as a result of the re-platforming. Last time I found that document and checked, we were using the fast ones.
 
@@ -71,11 +71,11 @@ On top of GDI, I believe there are things like Common Controls or comctl32.dll w
 
 As for DirectWrite and D2D and D3D and DXGI themselves, they're a separate set of commands and paths that are completely off to the side from GDI at all both in user and kernel mode. They're not really related other than that there's some interoperability provisions between the two. Most of our other UI frameworks tend to be built on top of the DirectX stack though. XAML is for sure. I think WPF is. Not sure about WinForms. And I believe the composition stack and the window manager are using DirectX as well.
 
-As for the input/interaction part of the pipeline (USER32), I tend to find most other newer things (at least for desktop PCs) are built on top of what is already there. USER32's major concept is windows and window handles and everything is sent to a window handle. As long as you're on a desktop machine (or a laptop or whatever... I mean a classic-style Windows-powered machine), there's a window handle involved and messages floating around and that means we're talking USER32. 
+As for the input/interaction part of the pipeline (USER32), I tend to find most other newer things (at least for desktop PCs) are built on top of what is already there. USER32's major concept is windows and window handles and everything is sent to a window handle. As long as you're on a desktop machine (or a laptop or whatever... I mean a classic-style Windows-powered machine), there's a window handle involved and messages floating around and that means we're talking USER32.
 
-The window message queue is just a straight up FIFO (more or less) of whatever input has occurred relevant to that window while it's in the foreground + whatever has been sent to the window by other components in the system. 
+The window message queue is just a straight up FIFO (more or less) of whatever input has occurred relevant to that window while it's in the foreground + whatever has been sent to the window by other components in the system.
 
-The newer technologies and the frameworks like XAML and WPF and WinForms tend to receive the messages from the window message queue one way or another and process them and turn them into event callbacks to various objects that they've provisioned within their world. 
+The newer technologies and the frameworks like XAML and WPF and WinForms tend to receive the messages from the window message queue one way or another and process them and turn them into event callbacks to various objects that they've provisioned within their world.
 
 However, the newer technologies that also work on other non-desktop platforms like XAML tend to have the ability to process stuff off of a completely different non-USER32 stack as well. There's a separate parallel stack to USER32 with all of our new innovations and realizations on how input and interaction should occur that doesn't exactly deal with classic messaging queues and window handles the same way. This is the whole Core* family of things like CoreWindow and CoreMessaging. They also have a different concept of "what is a user" that isn't so centric around your butt in rolling chair in front of a screen with a keyboard and mouse on the desk.
 
@@ -83,7 +83,7 @@ Now, if you're on XAML or one of the other Frameworks... all this intricacy is h
 
 The trick is that GDI32 and USER32 were designed for a limited world with a limited set of commands. Desktop PCs were the only thing that existed, single user at the keyboard and mouse, simple graphics output to a VGA monitor. So using them directly at the "low level" like conhost does is pretty easy. The new platforms could be used at the "low level" but they're orders of magnitude more complicated because they now account for everything that has happened with personal computing in 20+ years like different form factors, multiple active users, multiple graphics adapters, and on and on and on and on. So you tend to use a framework when using the new stuff so your head doesn't explode. They handle it for you, but they handle more than they ever did before so they're slower to some degree.
 
-So are GDI32 and USER32 "lower" than the new stuff? Sort of. 
+So are GDI32 and USER32 "lower" than the new stuff? Sort of.
 Can you get that low with the newer stuff? Mostly yes, but you probably shouldn't and don't want to.
 Does new live on top of old or is old replatformed on the new? Sometimes and/or partially.
 Basically... it's like the answer to anything software... "it's an unmitigated disaster and if we all stepped back a moment, we should be astounded that it works at all." :P
@@ -94,7 +94,7 @@ Original Source: https://github.com/microsoft/terminal/issues/327#issuecomment-4
 
 ## <a name="fesb"></a>Output Processing between "Far East" and "Western"
 
-> 
+>
 > ```
 > if (WI_IsFlagSet(CharType, C1_CNTRL))
 > ```
@@ -120,7 +120,7 @@ Note in both of these, there is a little bit of indirection before `MultiByteToW
 When we took over the console codebase, this variation between "Western" and "Eastern" countries was especially painful because `conhost.exe` would choose which one it was in based on the `Codepage for Non-Unicode Applications` set in the Control Panel's Regional > Administrative panel and it could only be changed with a reboot. It wouldn't even change properly when you `chcp` to a different codepage. Heck, `chcp` would deny you from switching into many codepages. There was a block in place to prevent going to an "Eastern" codepage if you booted up in a "Western" codepage. There was also a block preventing you from going between "Eastern" codepages, if I recall correctly.
 
 In modernizing, I decided a few things:
-1. What's good for the "Far East" should be good for the rest of the world. CJK languages that encompassed the "Far East" code have to be able to handle "Western" text as well even if the reverse wasn't true. 
+1. What's good for the "Far East" should be good for the rest of the world. CJK languages that encompassed the "Far East" code have to be able to handle "Western" text as well even if the reverse wasn't true.
 2. We need to scrub all usages of "Far East" from the code. Someone already started that and replaced them with "East Asia" except then they left behind the shorthand of "FE" prefixing dozens of functions which made it hard to follow the code. It took us months to realize "FE" and "East Asia" were the same thing.
 3. It's obnoxious that the way this was handled was to literally double-define every output function in the code base to have two definitions, compile them both into the conhost, then choose to run down the SB_ versions or the FE_ versions depending on the startup Non-Unicode codepage. It was a massive pile of complex pre-compilation `#ifdef` and `#else`s that would sometimes surround individual lines in the function bodies. Gross.
 4. The fact that the FE_ versions of the functions were way slower than the SB_ ones was unacceptable even for the same output of Latin-character text.
@@ -139,13 +139,13 @@ Original Source: https://github.com/microsoft/terminal/issues/166#issuecomment-5
 
 ## <a name="backport"></a>Why do we not backport things?
 
-Someone has to prove that this is costing millions to billions of dollars of lost productivity or revenue to outweigh the risks of shipping the fix to hundreds of millions of Windows machines and potentially breaking something. 
+Someone has to prove that this is costing millions to billions of dollars of lost productivity or revenue to outweigh the risks of shipping the fix to hundreds of millions of Windows machines and potentially breaking something.
 
-Our team generally finds it pretty hard to prove that against the developer audience given that they're only a small portion of the total installed market of Windows machines. 
+Our team generally finds it pretty hard to prove that against the developer audience given that they're only a small portion of the total installed market of Windows machines.
 
 Our only backport successes really come from corporations with massive addressable market (like OEMs shipping PCs) who complain that this is fouling up their manufacturing line (or something of that ilk). Otherwise, our management typically says that the risks don't outweigh the benefits.
 
-It's also costly in terms of time, effort, and testing for us to validate a modification to a released OS. We have a mindbogglingly massive amount of automated machinery dedicated to processing and validating the things that we check in while developing the current OS builds. But it's a special costly ask to spin up some to all of those activities to validate backported fixes. We do it all the time for Patch Tuesday, but in those patches, they only pass through the minimum number of fixes required to maximize the restoration of productivity/security/revenue/etc. because every additional fix adds additional complexity and additional risk. 
+It's also costly in terms of time, effort, and testing for us to validate a modification to a released OS. We have a mindbogglingly massive amount of automated machinery dedicated to processing and validating the things that we check in while developing the current OS builds. But it's a special costly ask to spin up some to all of those activities to validate backported fixes. We do it all the time for Patch Tuesday, but in those patches, they only pass through the minimum number of fixes required to maximize the restoration of productivity/security/revenue/etc. because every additional fix adds additional complexity and additional risk.
 
 So from our little team working hard to make developers happy, we virtually never make the cut for servicing. We're sorry, but we hope you can understand. It's just the reality of the situation to say "nope" when people ask for a backport. In our team's ideal world, you would all be running the latest console bits everywhere every time we make a change. But that's just not how it is today.
 
@@ -189,7 +189,7 @@ _guest speaker @zadjii-msft_
 
 I think there might be a bit of a misunderstanding here - there are two different kinds of applications we're talking about here:
 * shell applications, like `cmd.exe`, `powershell`, `zsh`, etc. These are text-only applications that emit streams of characters. They don't care at all about how they're eventually rendered to the user. These are also sometimes referred to as "commandline client" applications.
-* terminal applications, like the Windows Terminal, gnome-terminal, xterm, iterm2, hyper. These are graphical applications that can be used to render the output of commandline clients. 
+* terminal applications, like the Windows Terminal, gnome-terminal, xterm, iterm2, hyper. These are graphical applications that can be used to render the output of commandline clients.
 
 On Windows, if you just run `cmd.exe` directly, the OS will create an instance of `conhost.exe` as the _terminal_ for `cmd.exe`. The same thing happens for `powershell.exe`, the system will create a new conhost window for any client that's not already connected to a terminal of some sort. This has lead to an enormous amount of confusion for people thinking that a conhost window is actually a "`cmd` window". `cmd` can't have a window, it's just a commandline application. Its window is always some other terminal.
 
diff --git a/doc/WindowsTestPasses.md b/doc/WindowsTestPasses.md
index f733f98af58..1689bbb4438 100644
--- a/doc/WindowsTestPasses.md
+++ b/doc/WindowsTestPasses.md
@@ -31,12 +31,12 @@ Prerequisites:
 1. Right click the machine name in the `Device Manager` list and choose `Launch T-Shell`. You can also use `Connect via Console` to get a "remote desktop"-like session to the KVM port on the VM.
 1. In T-shell, use `testd Microsoft.Console.TestLab.Desktop.testlist` or a command of that format with a different TESTLIST or TESTMD name from our project (see the [UniversalTest.md] documentation). The `testd` utility will automatically resolve the build/branch/flavor information, dig through the build shares for the matching TESTLIST/TESTMD metadata, and attempt to deploy all relevant packages and dependencies on the device. When it's successful, it will move onto running all the tests and giving you the results. On conclusion, the test results should pop up in the web browser or the `Hubble - Log Viewer` tool provided by the Engineering Systems team.
 
-If some of the above things do not work, go to [https://osgwiki.com] and type them into the Search bar. For instance, if T-Shell isn't found or working, you can find out where to get it or download it on `OSGWiki`. The same goes for the other commands besides `testd` to use in T-shell and more information on what `Hubble` or `Nebula` are. 
+If some of the above things do not work, go to [https://osgwiki.com] and type them into the Search bar. For instance, if T-Shell isn't found or working, you can find out where to get it or download it on `OSGWiki`. The same goes for the other commands besides `testd` to use in T-shell and more information on what `Hubble` or `Nebula` are.
 
 Presumably now you have a failure. Or a success. You can attempt to spelunk the logs in `Hubble` and you might come to a conclusion. Or you can move onto debugging directly.
 
-Now that you've relied on `testd` to get everything deployed and orchestrated and run once on the device, you can use `execd` to run things again or to run a smaller subset of things on the remote device through `T-Shell`. 
+Now that you've relied on `testd` to get everything deployed and orchestrated and run once on the device, you can use `execd` to run things again or to run a smaller subset of things on the remote device through `T-Shell`.
 
-By default, in the `Universal Test` world, everything will be deployed onto the remote machine at `C:\data\test\bin`. In T-Shell, use `cdd C:\data\test\bin` to change to that directory and then `execd te.exe Microsoft.Console.Host.FeatureTests.dll /name:*TestReadFileEcho*` to run just one specific test. Of course you should substitute the file name and test name parameters as makes sense. And of course you can find out more about `cdd` and `execd` on the `T-shell` page of `OSGWiki`.
+By default, in the `Universal Test` world, everything will be deployed onto the remote machine at `C:\data\test\bin`. In T-Shell, use `cdd C:\data\test\bin` to change to that directory and then `execd te.exe Microsoft.Console.Host.FeatureTests.dll /name:*TestReadFileEcho*` to run just one specific test. Of course, you should substitute the file name and test name parameters as makes sense. And of course you can find out more about `cdd` and `execd` on the `T-shell` page of `OSGWiki`.
 
 Fortunately, running things through `T-shell` in this fashion is exactly the same way that the testlab orchestrates the tests. If you still don't get good data this way, you can use the `Connect via Console` mechanism way above to try to run things under `WinDBG` or the `Visual Studio Remote Debugger` manually on the machine to get them to repro or under the debugger more completely.
diff --git a/doc/creating_a_new_project.md b/doc/creating_a_new_project.md
index 0f7f3bd880a..2e17b097c6e 100644
--- a/doc/creating_a_new_project.md
+++ b/doc/creating_a_new_project.md
@@ -6,7 +6,7 @@ When creating a new DLL, it was really helpful to reference an existing DLL's `.
 
 - [ ] Make sure to `<Import>` our pre props at the _top_ of the vcxproj, and our post props at the _bottom_ of the vcxproj.
 ```
-<!-- pre props --> 
+<!-- pre props -->
 <Import Project="..\..\..\common.openconsole.props" Condition="'$(OpenConsoleDir)'==''" />
 <Import Project="$(OpenConsoleDir)src\cppwinrt.build.pre.props" />
 
@@ -35,7 +35,7 @@ DllGetActivationFactory = WINRT_GetActivationFactory    PRIVATE
 - _Note_: If your new library eventually rolls up as a reference to our Centennial Packaging project `CascadiaPackage`, you don't have to worry about manually adding your definitions to the `AppXManifest.xml` because the Centennial Packaging project automatically enumerates the reference tree of WinMDs and stitches that information into the `AppXManifest.xml`. However, if your new project does _not_ ultimately roll up to a packaging project that will automatically put the references into `AppXManifest`, you will have to add them in manually.
 
 ### Troubleshooting
-- If you hit an error that looks like this: 
+- If you hit an error that looks like this:
     ```
     X found processing metadata file ..\blah1\Microsoft.UI.Xaml.winmd, type already exists in file ..\blah\NewDLLProject\Microsoft.UI.Xaml.winmd.
     ```
@@ -51,4 +51,4 @@ DllGetActivationFactory = WINRT_GetActivationFactory    PRIVATE
 
 - If you hit a `Class not Registered` error, this might be because a class isn't getting registered in the app manifest. You can go check `src/cascadia/CascadiaPackage/bin/x64/Debug/AppX/AppXManifest.xml` to see if there exist entries to the classes of your newly created DLL. If the references aren't there, double check that you've added `<ProjectReference>` blocks to both `WindowsTerminal.vcxproj` and `TerminalApp.vcxproj`.
 
-- If you hit an extremely vague error along the lines of `Error in the DLL`, and right before that line you notice that your new DLL is loaded and unloaded right after each other, double check that your new DLL's definitions show up in the `AppXManifest.xml` file. If your new DLL is included as a reference to a project that rolls up to `CascadiaPackage`, double check that you've created a `.def` file for the project. Otherwise if your new project _does not_ roll up to a package that populates the `AppXManifest` references for you, you'll have to add those references yourself.
+- If you hit an extremely vague error along the lines of `Error in the DLL`, and right before that line you notice that your new DLL is loaded and unloaded right after each other, double check that your new DLL's definitions show up in the `AppXManifest.xml` file. If your new DLL is included as a reference to a project that rolls up to `CascadiaPackage`, double check that you've created a `.def` file for the project. Otherwise, if your new project _does not_ roll up to a package that populates the `AppXManifest` references for you, you'll have to add those references yourself.
diff --git a/doc/specs/#1564 - Settings UI/cascading-settings.md b/doc/specs/#1564 - Settings UI/cascading-settings.md
index 78d8fd7bbfb..0c358f945e2 100644
--- a/doc/specs/#1564 - Settings UI/cascading-settings.md	
+++ b/doc/specs/#1564 - Settings UI/cascading-settings.md	
@@ -9,7 +9,7 @@ issue id: 1564
 
 ## Abstract
 
-Windows Terminal's settings model adheres to a cascading settings architecture. This allows a settings object to be defined incrementally across multiple layers of declarations. The value for any global setting like `copyOnSelect`, for example, is set to your settings.json value if one is defined, otherwise defaults.json, and otherwise a system set value. Profiles in particular are more complicated in that they must also take into account the values in `profiles.defaults` and dynamic profile generators.
+Windows Terminal's settings model adheres to a cascading settings architecture. This allows a settings object to be defined incrementally across multiple layers of declarations. The value for any global setting like `copyOnSelect`, for example, is set to your settings.json value if one is defined; otherwise, defaults.json, and otherwise a system set value. Profiles in particular are more complicated in that they must also take into account the values in `profiles.defaults` and dynamic profile generators.
 
 This spec explores how to represent this feature in the Settings UI.
 
diff --git a/doc/specs/#1595 - Suggestions UI/Snippets.md b/doc/specs/#1595 - Suggestions UI/Snippets.md
index f80a9cf52f6..39cd15de8a2 100644
--- a/doc/specs/#1595 - Suggestions UI/Snippets.md	
+++ b/doc/specs/#1595 - Suggestions UI/Snippets.md	
@@ -529,7 +529,7 @@ their own workflows.
   * `--local`: Save to the `.wt.json` in the CWD, if there is one (or create
     one)
   * `--parent`: Save to the `.wt.json` in the first ancestor of the CWD, if
-    there is one. Otherwise create one here.
+    there is one. Otherwise, create one here.
   * `--settings`: Manually save to the settings file?
   * `--profile`: save to this profile???? Not sure if this is actually possible.
     Maybe with the `WT_SESSION_ID` env var to figure out which profile is in use
diff --git a/doc/specs/#1790 - Font features and axes-spec.md b/doc/specs/#1790 - Font features and axes-spec.md
index 26cc5fd40a5..bc524a40991 100644
--- a/doc/specs/#1790 - Font features and axes-spec.md	
+++ b/doc/specs/#1790 - Font features and axes-spec.md	
@@ -23,7 +23,7 @@ In a similar vein, many fonts allow for setting variations on the font along cer
 
 ### Font features
 
-It is already possible to pass in a list of [font feature structs](https://docs.microsoft.com/en-us/windows/win32/api/dwrite/ns-dwrite-dwrite_font_feature) to DWrite for it to handle. A font feature struct contains only 2 things: 
+It is already possible to pass in a list of [font feature structs](https://docs.microsoft.com/en-us/windows/win32/api/dwrite/ns-dwrite-dwrite_font_feature) to DWrite for it to handle. A font feature struct contains only 2 things:
 
 1. A font feature tag
 2. A parameter value
@@ -78,7 +78,7 @@ Aside from additional parsing required for the settings file (which inherently o
 
 ### Compatibility
 
-Older versions of Windows may not have the DWrite updates that allow for defining font features and axes of variation. We must make sure to fallback to the current implementation in these cases.
+Older versions of Windows may not have the DWrite updates that allow for defining font features and axes of variation. We must make sure to fall back to the current implementation in these cases.
 
 ### Performance, Power, and Efficiency
 
@@ -102,4 +102,4 @@ We will also need to consider how we want to represent this in the settings UI.
 
 [DWRITE_FONT_FEATURE structure](https://docs.microsoft.com/en-us/windows/win32/api/dwrite/ns-dwrite-dwrite_font_feature)
 
-[DWRITE_FONT_AXIS_VALUE structure](https://docs.microsoft.com/en-us/windows/win32/api/dwrite_3/ns-dwrite_3-dwrite_font_axis_value)
\ No newline at end of file
+[DWRITE_FONT_AXIS_VALUE structure](https://docs.microsoft.com/en-us/windows/win32/api/dwrite_3/ns-dwrite_3-dwrite_font_axis_value)
diff --git a/doc/specs/#4066 - Theme-controlled color scheme switch.md b/doc/specs/#4066 - Theme-controlled color scheme switch.md
index 9cb41b3571a..ed40c9f42db 100644
--- a/doc/specs/#4066 - Theme-controlled color scheme switch.md	
+++ b/doc/specs/#4066 - Theme-controlled color scheme switch.md	
@@ -17,7 +17,7 @@ I work remotely as a developer, so I have to spend a lot of hours in front of my
 
 Normally I like dark modes in all the programs and apps I use, but when there's too much sunlight, it becomes annoying, and sometimes even painful, to work in dark mode. So, I have all the programs and apps I use (at least, those that can) set to switch their color themes to what the system has.
 
-The company I work for sent me a Macbook Pro, and my personal phone is an Android, both with automatic dark mode at sunset and light mode at sunrise, and in those devices it's been working relatively well. In Windows, as it is known, there's no such feature, so I manually change between dark and light mode when it's needed, and most of the programs and apps I use go along with this change. Windows Terminal, is not one of them.
+The company I work for sent me a MacBook Pro, and my personal phone is an Android, both with automatic dark mode at sunset and light mode at sunrise, and in those devices it's been working relatively well. In Windows, as it is known, there's no such feature, so I manually change between dark and light mode when it's needed, and most of the programs and apps I use go along with this change. Windows Terminal, is not one of them.
 
 The theme changes just as expected, but in an app like this, this change only affects the top of the window, leaving almost all of the screen at the mercy of what the color scheme is, and it doesn't depend on the theme, which defeats any attempt to make a good use of the `system` theme feature.
 
diff --git a/doc/specs/#5000 - Process Model 2.0/#4472 - Windows Terminal Session Management.md b/doc/specs/#5000 - Process Model 2.0/#4472 - Windows Terminal Session Management.md
index 538da23725f..625ef51e927 100644
--- a/doc/specs/#5000 - Process Model 2.0/#4472 - Windows Terminal Session Management.md	
+++ b/doc/specs/#5000 - Process Model 2.0/#4472 - Windows Terminal Session Management.md	
@@ -94,7 +94,7 @@ configurations:
 
 - `"useExisting"`: always glom to the most recent window, regardless of desktop.
 - `"useExistingOnSameDesktop"`: Only glom if there's an existing window on this
-  virtual desktop, otherwise create a new window. This will be the new default
+  virtual desktop; otherwise, create a new window. This will be the new default
   value.
 - `"useNew"`: Never glom, always create a new window. This is technically the
   current behavior of the Terminal.
diff --git a/doc/specs/#5000 - Process Model 2.0/#5000 - Process Model 2.0.md b/doc/specs/#5000 - Process Model 2.0/#5000 - Process Model 2.0.md
index 72a672cffab..620e5c30a60 100644
--- a/doc/specs/#5000 - Process Model 2.0/#5000 - Process Model 2.0.md	
+++ b/doc/specs/#5000 - Process Model 2.0/#5000 - Process Model 2.0.md	
@@ -362,7 +362,7 @@ Essentially, the probabilistic elective monarchy will work in the following way:
     register.
 3. After registering as a server for `Monarch`s, attempt to create a `Monarch`
    using `winrt::create_instance`.
-4. Using that `Monarch`, ask it for it's PID.
+4. Using that `Monarch`, ask it for its PID.
    - If that PID is the same as the PID of the current process, then the window
      process knows that it is the monarch.
    - If that PID is some other process, then we know that we're not currently
@@ -1102,7 +1102,7 @@ launch to use seems like an obvious next step. See also [#961].
     - `true` or `"always"`: always glom to the most recent window, regardless of
       desktop
     - `"sameDesktop"`: Only glom if there's an existing window on this virtual
-      desktop, otherwise create a new window
+      desktop; otherwise, create a new window
     - `false` or `"never"`: Never glom, always create a new window.
 
 
diff --git a/doc/specs/#605 - Search/spec.md b/doc/specs/#605 - Search/spec.md
index 66a3b6dd540..e828cec0f8e 100644
--- a/doc/specs/#605 - Search/spec.md	
+++ b/doc/specs/#605 - Search/spec.md	
@@ -13,7 +13,7 @@ This spec is for feature request #605 "Search". It goes over the details of a ne
 
 ## Inspiration
 
-One of the superior features of iTerm2 is it's content search. The search comes in two variants: search from active tab and search from all tabs. In almost any editor, there is an roughly equivalent string search. We also want to realize search experience in Terminal. There will be two variants, search within one tab or from multiple tabs. We will start with one-tab search implementation.
+One of the superior features of iTerm2 is it's content search. The search comes in two variants: search from active tab and search from all tabs. In almost any editor, there is a roughly equivalent string search. We also want to realize search experience in Terminal. There will be two variants, search within one tab or from multiple tabs. We will start with one-tab search implementation.
 
 ## Solution Design
 
diff --git a/doc/specs/#7335 - Console Allocation Policy.md b/doc/specs/#7335 - Console Allocation Policy.md
index c094a8edfc3..f05df179d1b 100644
--- a/doc/specs/#7335 - Console Allocation Policy.md	
+++ b/doc/specs/#7335 - Console Allocation Policy.md	
@@ -331,7 +331,7 @@ Are there other allocation policies we need to consider?
     - requires coordination between tooling teams both within and without Microsoft (regarding any tool that operates on
       or produces PE files)
 
-- An exported symbol that shells can check for to determine whether to wait for the attached process to exit
+- An exported symbol that shells can check for in order to determine whether to wait for the attached process to exit
     - relies on shells to update and check for this
     - cracking an executable to look for symbols is probably the last thing shells want to do
         - we could provide an API to determine whether to wait or return?
diff --git a/doc/specs/#754 - Cascading Default Settings.md b/doc/specs/#754 - Cascading Default Settings.md
index 73fd1928dc0..5d43c2d0c06 100644
--- a/doc/specs/#754 - Cascading Default Settings.md	
+++ b/doc/specs/#754 - Cascading Default Settings.md	
@@ -360,7 +360,7 @@ GUID GetNamespaceGuid(IDynamicProfileGenerator& generator);
 GUID GetGuidForName(IDynamicProfileGenerator& generator, std::wstring& name);
 ```
 
-The generator does not _need_ to use `GetGuidForName` to generate guids for it's
+The generator does not _need_ to use `GetGuidForName` to generate guids for its
 profiles. If the generator can determine another way to generate stable GUIDs
 for its profiles, it's free to use whatever method it wants. `GetGuidForName` is
 provided as a convenience.
diff --git a/doc/specs/#885 - Terminal Settings Model/#885 - Terminal Settings Model.md b/doc/specs/#885 - Terminal Settings Model/#885 - Terminal Settings Model.md
index 5426c9716da..6e27d19238e 100644
--- a/doc/specs/#885 - Terminal Settings Model/#885 - Terminal Settings Model.md	
+++ b/doc/specs/#885 - Terminal Settings Model/#885 - Terminal Settings Model.md	
@@ -151,11 +151,11 @@ void CascadiaSettings::LayerJson(const Json::Value& json)
     // repeat the same for Profiles...
 }
 ```
-For `defaults.json`, `_globals` will now hold all of the values set in `defaults.json`. If any settings were omitted from the `defaults.json`, `_globals` will fallback to its parent (a `GlobalAppSettings` consisting purely of system-defined values).
+For `defaults.json`, `_globals` will now hold all of the values set in `defaults.json`. If any settings were omitted from the `defaults.json`, `_globals` will fall back to its parent (a `GlobalAppSettings` consisting purely of system-defined values).
 
-For `settings.json`, `_globals` will only hold the values set in `settings.json`. If any settings were omitted from `settings.json`, `_globals` will fallback to its parent (the `GlobalAppSettings` built from `defaults.json`).
+For `settings.json`, `_globals` will only hold the values set in `settings.json`. If any settings were omitted from `settings.json`, `_globals` will fall back to its parent (the `GlobalAppSettings` built from `defaults.json`).
 
-This process becomes a bit more complex for `Profile` because it can fallback in the following order:
+This process becomes a bit more complex for `Profile` because it can fall back in the following order:
 1. `settings.json` profile
 2. `settings.json` `profiles.defaults`
 3. (if a dynamic profile) the hard-coded value in the dynamic profile generator
diff --git a/doc/specs/drafts/#2634 - Broadcast Input/#2634 - Broadcast Input.md b/doc/specs/drafts/#2634 - Broadcast Input/#2634 - Broadcast Input.md
index c201c0bc33a..6bf09a57864 100644
--- a/doc/specs/drafts/#2634 - Broadcast Input/#2634 - Broadcast Input.md	
+++ b/doc/specs/drafts/#2634 - Broadcast Input/#2634 - Broadcast Input.md	
@@ -101,8 +101,8 @@ The scopes would work as follows:
   this tab.
   - **TODO!: FOR DISCUSSION**: Should this disable the tab's
       "broadcastToAllPanes" setting? Or should it leave that alone?
-* `"disableBroadcastInput"`: Set the global setting to false, the tab's setting
-  to false, and clear the set of panes being broadcasted to for this tab.
+* `"disableBroadcastInput"`: For this tab, set the global setting to false,
+  the tab's setting to false, and clear the set of panes being broadcasted.
   - **TODO!** This could also just be `"action": "toggleBroadcastInput",
     "scope": "none"`
 
@@ -161,7 +161,7 @@ As far as actions, we're looking at something like:
     from the broadcast set. Otherwise, add all the panes from this tab to the
     broadcast set.
 * **D** toggle sending input to the current pane
-  * If this pane is in the broadcast set, remove it. Otherwise add it.
+  * If this pane is in the broadcast set, remove it. Otherwise, add it.
 This seems to break down into the following actions:
 
 ```json
diff --git a/doc/terminal-a11y-2023.md b/doc/terminal-a11y-2023.md
index 36861203198..60be666fb93 100644
--- a/doc/terminal-a11y-2023.md
+++ b/doc/terminal-a11y-2023.md
@@ -8,12 +8,12 @@ Since accessibility is a very broad area, this document is intended to present r
 ### First-party terminals
 For many years, Console Host (Conhost) was the only first-party terminal on Windows. In 2019, Windows Terminal was released to the world as an open source first-party terminal. Windows Terminal was distributed through the Microsoft Store and received regular updates throughout the year, much more frequently than Conhost. In October 2022, Windows Terminal was enabled as the default terminal on Windows.
 
-A significant amount of code is shared between Conhost and Windows Terminal to create the terminal area. To enable an accessible experience for this area, a shared UI Automation provider was introduced in 2019[^1], enabling accessibility tools to navigate and read contents from the terminal area. In 2020, Windows Terminal was updated to dispatch UIA events signaling when the cursor position, text output, or selection changed; this left the work of identifying what changed in the output to the attached screen reader application[^2]. In 2022, Windows Terminal was updated to dispatch UIA notifications with a payload of what text was written to the screen[^3]. 
+A significant amount of code is shared between Conhost and Windows Terminal to create the terminal area. To enable an accessible experience for this area, a shared UI Automation provider was introduced in 2019[^1], enabling accessibility tools to navigate and read contents from the terminal area. In 2020, Windows Terminal was updated to dispatch UIA events signaling when the cursor position, text output, or selection changed; this left the work of identifying what changed in the output to the attached screen reader application[^2]. In 2022, Windows Terminal was updated to dispatch UIA notifications with a payload of what text was written to the screen[^3].
 
 ### Internal Partners
 There are many first-party command-line applications on Windows. The following are a few examples of those that are regularly updated:
 - [**GitHub CLI**](https://cli.github.com/): a tool that can be used to query and interact with GitHub repos (open source)
-- [**Winget**](https://github.com/microsoft/winget-cli): a tool to install applications and other packages
+- [**WinGet**](https://github.com/microsoft/winget-cli): a tool to install applications and other packages
 - [**PSReadLine**](https://github.com/PowerShell/PSReadLine): a PowerShell module that enhances the input line experience
 - [**Windows Subsystem for Linux (WSL)**](https://learn.microsoft.com/en-us/windows/wsl/): a tool to manage and run GNU/Linux environments without a traditional virtual machine
 - [**PowerShell**](https://github.com/PowerShell/PowerShell): a cross-platform command-line shell (open source)
@@ -33,7 +33,7 @@ The following examples don't take over the entire viewport:
 - [**Oh My Posh**](https://ohmyposh.dev/): a tool to customize shell prompts
 - **git**: a tool for version control
 The following examples operate as command-line shells:
-- [**Bash**](https://www.gnu.org/software/bash/) is the default shell for most Linux distributions  
+- [**Bash**](https://www.gnu.org/software/bash/) is the default shell for most Linux distributions
 - [**Fish shell**](https://fishshell.com/) provides a rich shell experience with features like autosuggestion support and VGA colors
 - [**Z shell**](https://zsh.sourceforge.io/) is an extended Bourne shell
 
@@ -113,7 +113,7 @@ This issue is tracked by [megathread: Scrollbar Marks · Issue #11000](https://g
 ### Mark Mode support for degenerate range
 [PR #13053](https://github.com/microsoft/terminal/pull/13053) added support for mark mode in Windows Terminal. Mark mode allows users to create and modify selections by exclusively using the keyboard. However, screen reader users have reported it as a strange experience because it always has a cell of text selected; this results in the screen reader reading "x selected, y unselected" as opposed to the expected "x" when moving the cursor around.
 
-Unfortunately, the changes required to fix this are very extensive because selections are stored as two inclusive terminal coordinates, which makes it impossible to represent an empty selection. 
+Unfortunately, the changes required to fix this are very extensive because selections are stored as two inclusive terminal coordinates, which makes it impossible to represent an empty selection.
 
 This is tracked by [A11y: windows terminal emits selection/deselection events in mark mode when navigating with arrow keys · Issue #13447](https://github.com/microsoft/terminal/issues/13447).
 
@@ -158,7 +158,7 @@ In 2022, Windows Terminal added UI Automation notifications that contained a pay
 UIA notifications have provided many compatibility benefits since screen readers automatically read notifications they receive. Additionally, this has provided the possibility for major performance enhancements as screen readers may no longer be required to diff the text buffer and figure out what has changed. NVDA has prototyped listening to notifications and ignoring text changed events entirely[^7]. However, it reveals underlying challenges with this new model such as how to handle passwords. The proposals listed in this section are intended to have Windows Terminal achieve improved performance and accessibility quality.
 
 #### VT Screen Reader Control
-Some command-line applications are simply too difficult to create a consistent accessible experience. Applications that draw decorative content, for example, may have that content read by a screen reader. 
+Some command-line applications are simply too difficult to create a consistent accessible experience. Applications that draw decorative content, for example, may have that content read by a screen reader.
 
 In 2019, Daniel Imms wrote a spec proposing a VT sequence that can partially control the attached screen reader[^8]. This VT sequence consists of three main formats:
 1. Stop announcing incoming data to the screen reader. The screen reader will resume announcing incoming data if any key is pressed.
@@ -214,4 +214,4 @@ Generally, the reasoning behind these priorities can be broken down as follows:
 [^5]: [Implement the Delta E algorithm to improve color perception by PankajBhojwani · Pull Request #11095](https://github.com/microsoft/terminal/pull/11095)
 [^6]: [Change AdjustIndistinguishableColors to an enum setting instead of a boolean setting by PankajBhojwani · Pull Request #13512](https://github.com/microsoft/terminal/pull/13512)
 [^7]: [Prototype for Windows Terminal: Use notifications instead of monitoring for new text by leonardder · Pull Request #14047 · nvaccess/nvda (github.com)](https://github.com/nvaccess/nvda/pull/14047)
-[^8]: [Control Screen Reader from Applications (#18) · Issues · terminal-wg / specifications · GitLab](https://gitlab.freedesktop.org/terminal-wg/specifications/-/issues/18)
\ No newline at end of file
+[^8]: [Control Screen Reader from Applications (#18) · Issues · terminal-wg / specifications · GitLab](https://gitlab.freedesktop.org/terminal-wg/specifications/-/issues/18)
diff --git a/policies/en-US/WindowsTerminal.adml b/policies/en-US/WindowsTerminal.adml
index f2bcf71d3c3..b0be1c3d57d 100644
--- a/policies/en-US/WindowsTerminal.adml
+++ b/policies/en-US/WindowsTerminal.adml
@@ -22,7 +22,7 @@ Note: Existing profiles will disappear from Windows Terminal after adding their
       <string id="DefaultTerminalApplication">Default terminal application</string>
       <string id="DefaultTerminalApplicationText">Select the default terminal application used in Windows.
 
-If you select Windows Terminal Preview and it is not installed the system will fallback to the legacy Windows Console Host. (Please note that the settings interfaces showing "Let windows decide" in this case as configuration.)</string>
+If you select Windows Terminal Preview and it is not installed the system will fall back to the legacy Windows Console Host. (Please note that the settings interfaces showing "Let windows decide" in this case as configuration.)</string>
       <string id="TermAppAutomatic">Automatic selection (Windows Terminal, if available)</string>
       <string id="TermAppConsoleHost">Windows Console Host (legacy)</string>
       <string id="TermAppWindowsTerminal">Windows Terminal</string>
diff --git a/samples/ConPTY/GUIConsole/GUIConsole.WPF/MainWindow.xaml b/samples/ConPTY/GUIConsole/GUIConsole.WPF/MainWindow.xaml
index 2c67f1cb0ee..36cc20b91f6 100644
--- a/samples/ConPTY/GUIConsole/GUIConsole.WPF/MainWindow.xaml
+++ b/samples/ConPTY/GUIConsole/GUIConsole.WPF/MainWindow.xaml
@@ -32,7 +32,7 @@
                BasedOn="{StaticResource TitleBarButtonStyle}"
                TargetType="{x:Type Button}">
             <Setter Property="Content" Value="&#xE10A;" />
-            <!--  Remove the default Button template's Triggers, otherwise they'll override our trigger below.  -->
+            <!--  Remove the default Button template's Triggers; otherwise, they'll override our trigger below.  -->
             <Setter Property="Template">
                 <Setter.Value>
                     <ControlTemplate TargetType="{x:Type Button}">
diff --git a/src/buffer/out/textBuffer.cpp b/src/buffer/out/textBuffer.cpp
index 11f48ec0f64..6f0336e8bcd 100644
--- a/src/buffer/out/textBuffer.cpp
+++ b/src/buffer/out/textBuffer.cpp
@@ -2969,7 +2969,7 @@ void TextBuffer::_SerializeRow(const ROW& row, const til::CoordType startX, cons
 //   parameter and we'll calculate the position of the _end_ of those rows in
 //   the new buffer. The rows's new value is placed back into this parameter.
 // Return Value:
-// - S_OK if we successfully copied the contents to the new buffer, otherwise an appropriate HRESULT.
+// - S_OK if we successfully copied the contents to the new buffer; otherwise, an appropriate HRESULT.
 void TextBuffer::Reflow(TextBuffer& oldBuffer, TextBuffer& newBuffer, const Viewport* lastCharacterViewport, PositionInformation* positionInfo)
 {
     const auto& oldCursor = oldBuffer.GetCursor();
diff --git a/src/buffer/out/ut_textbuffer/ReflowTests.cpp b/src/buffer/out/ut_textbuffer/ReflowTests.cpp
index e46e415e37d..58e7766c890 100644
--- a/src/buffer/out/ut_textbuffer/ReflowTests.cpp
+++ b/src/buffer/out/ut_textbuffer/ReflowTests.cpp
@@ -573,7 +573,7 @@ namespace
         TestCase{
             // This triggers the cursor being walked forward w/ newlines to maintain
             // distance from the last char in the buffer
-            L"SBCS, cursor at end of buffer, otherwise same as previous test",
+            L"SBCS, cursor at end of buffer; otherwise, same as previous test",
             {
                 TestBuffer{
                     { 6, 5 },
diff --git a/src/cascadia/ShellExtension/OpenTerminalHere.cpp b/src/cascadia/ShellExtension/OpenTerminalHere.cpp
index 88d4f435511..e3d0f813f6c 100644
--- a/src/cascadia/ShellExtension/OpenTerminalHere.cpp
+++ b/src/cascadia/ShellExtension/OpenTerminalHere.cpp
@@ -21,7 +21,7 @@ static constexpr std::wstring_view VerbName{ L"WindowsTerminalOpenHere" };
 // Arguments:
 // - psiItemArray: a IShellItemArray which contains the item that's selected.
 // Return Value:
-// - S_OK if we successfully attempted to launch the Terminal, otherwise a
+// - S_OK if we successfully attempted to launch the Terminal; otherwise, a
 //   failure from an earlier HRESULT.
 HRESULT OpenTerminalHere::Invoke(IShellItemArray* psiItemArray,
                                  IBindCtx* /*pBindContext*/)
diff --git a/src/cascadia/TerminalApp/AppActionHandlers.cpp b/src/cascadia/TerminalApp/AppActionHandlers.cpp
index 69648929637..50bd7cd1225 100644
--- a/src/cascadia/TerminalApp/AppActionHandlers.cpp
+++ b/src/cascadia/TerminalApp/AppActionHandlers.cpp
@@ -517,7 +517,7 @@ namespace winrt::TerminalApp::implementation
             else
             {
                 // Mark as handled only when the move succeeded (e.g. when there
-                // is a pane to move to), otherwise mark as unhandled so the
+                // is a pane to move to); otherwise, mark as unhandled so the
                 // keychord can propagate to the terminal (GH#6129)
                 const auto moveSucceeded = _MoveFocus(realArgs.FocusDirection());
                 args.Handled(moveSucceeded);
diff --git a/src/cascadia/TerminalApp/AppLogic.cpp b/src/cascadia/TerminalApp/AppLogic.cpp
index 6a0d4561428..53c3fde491f 100644
--- a/src/cascadia/TerminalApp/AppLogic.cpp
+++ b/src/cascadia/TerminalApp/AppLogic.cpp
@@ -194,7 +194,7 @@ namespace winrt::TerminalApp::implementation
     // Method Description:
     // - Attempt to load the settings. If we fail for any reason, returns an error.
     // Return Value:
-    // - S_OK if we successfully parsed the settings, otherwise an appropriate HRESULT.
+    // - S_OK if we successfully parsed the settings; otherwise, an appropriate HRESULT.
     [[nodiscard]] HRESULT AppLogic::_TryLoadSettings() noexcept
     {
         auto hr = E_FAIL;
diff --git a/src/cascadia/TerminalApp/ColorHelper.cpp b/src/cascadia/TerminalApp/ColorHelper.cpp
index c2dd4c2303c..2235cc6b370 100644
--- a/src/cascadia/TerminalApp/ColorHelper.cpp
+++ b/src/cascadia/TerminalApp/ColorHelper.cpp
@@ -8,7 +8,7 @@ using namespace winrt::TerminalApp;
 // - color: this color is going to be examined whether it
 // is light or not
 // Return Value:
-// - true of light, false if dark
+// - true if light, false if dark
 bool ColorHelper::IsBrightColor(const winrt::Windows::UI::Color& color)
 {
     // https://www.w3.org/TR/AERT#color-contrast
diff --git a/src/cascadia/TerminalApp/CommandPalette.cpp b/src/cascadia/TerminalApp/CommandPalette.cpp
index e2e7526db8c..13d058feab1 100644
--- a/src/cascadia/TerminalApp/CommandPalette.cpp
+++ b/src/cascadia/TerminalApp/CommandPalette.cpp
@@ -338,7 +338,7 @@ namespace winrt::TerminalApp::implementation
         }
         else if (key == VirtualKey::Escape)
         {
-            // Dismiss the palette if the text is empty, otherwise clear the
+            // Dismiss the palette if the text is empty; otherwise, clear the
             // search string.
             if (_searchBox().Text().empty())
             {
diff --git a/src/cascadia/TerminalApp/Pane.cpp b/src/cascadia/TerminalApp/Pane.cpp
index 3255c5fba3f..30ca4714eb5 100644
--- a/src/cascadia/TerminalApp/Pane.cpp
+++ b/src/cascadia/TerminalApp/Pane.cpp
@@ -1052,7 +1052,7 @@ std::shared_ptr<Pane> Pane::GetActivePane()
 // Arguments:
 // - <none>
 // Return Value:
-// - nullptr if this Pane is an unfocused parent, otherwise the TermControl of this Pane.
+// - nullptr if this Pane is an unfocused parent; otherwise, the TermControl of this Pane.
 TermControl Pane::GetLastFocusedTerminalControl()
 {
     if (!_IsLeaf())
@@ -1105,7 +1105,7 @@ IPaneContent Pane::GetLastFocusedContent()
 // Arguments:
 // - <none>
 // Return Value:
-// - nullptr if this Pane is a parent, otherwise the TermControl of this Pane.
+// - nullptr if this Pane is a parent; otherwise, the TermControl of this Pane.
 TermControl Pane::GetTerminalControl() const
 {
     if (const auto& terminalPane{ _getTerminalContent() })
@@ -1597,7 +1597,7 @@ void Pane::_CloseChildRoutine(const bool closeFirst)
         return;
     }
 
-    // Setup the animation
+    // Set up the animation
 
     auto removedChild = closeFirst ? _firstChild : _secondChild;
     auto remainingChild = closeFirst ? _secondChild : _firstChild;
@@ -1998,7 +1998,7 @@ void Pane::_SetupEntranceAnimation()
         if (splitWidth)
         {
             // If we're animating the first child, then stick to the top/left of
-            // the parent pane, otherwise use the bottom/right. This is always
+            // the parent pane; otherwise, use the bottom/right. This is always
             // the "outside" of the parent pane.
             childGrid.HorizontalAlignment(isFirstChild ? HorizontalAlignment::Left : HorizontalAlignment::Right);
             if (control)
@@ -2023,7 +2023,7 @@ void Pane::_SetupEntranceAnimation()
         else
         {
             // If we're animating the first child, then stick to the top/left of
-            // the parent pane, otherwise use the bottom/right. This is always
+            // the parent pane; otherwise, use the bottom/right. This is always
             // the "outside" of the parent pane.
             childGrid.VerticalAlignment(isFirstChild ? VerticalAlignment::Top : VerticalAlignment::Bottom);
             if (control)
@@ -2538,7 +2538,7 @@ std::pair<float, float> Pane::_CalcChildrenSizes(const float fullSize) const
 //   user doesn't get any pane shrank when they actually expand the window or parent pane.
 //   That is also required by the layout algorithm.
 // Arguments:
-// - widthOrHeight: if true, operates on width, otherwise on height.
+// - widthOrHeight: if true, operates on width; otherwise, on height.
 // - fullSize: the amount of space in pixels that should be filled by our children and
 //   their separator. Can be arbitrarily low.
 // Return Value:
@@ -2600,7 +2600,7 @@ Pane::SnapChildrenSizeResult Pane::_CalcSnappedChildrenSizes(const bool widthOrH
 //   align with their character grids as close as possible. Snaps to closes match
 //   (either upward or downward). Also makes sure to fit in minimal sizes of the panes.
 // Arguments:
-// - widthOrHeight: if true operates on width, otherwise on height
+// - widthOrHeight: if true operates on width; otherwise, on height
 // - dimension: a dimension (width or height) to snap
 // Return Value:
 // - A value corresponding to the next closest snap size for this Pane, either upward or downward
@@ -2615,7 +2615,7 @@ float Pane::CalcSnappedDimension(const bool widthOrHeight, const float dimension
 //   align with their character grids as close as possible. Also makes sure to
 //   fit in minimal sizes of the panes.
 // Arguments:
-// - widthOrHeight: if true operates on width, otherwise on height
+// - widthOrHeight: if true operates on width; otherwise, on height
 // - dimension: a dimension (width or height) to be snapped
 // Return Value:
 // - pair of floats, where first value is the size snapped downward (not greater than
@@ -2702,11 +2702,11 @@ Pane::SnapSizeResult Pane::_CalcSnappedDimension(const bool widthOrHeight, const
 
 // Method Description:
 // - Increases size of given LayoutSizeNode to match next possible 'snap'. In case of leaf
-//   pane this means the next cell of the terminal. Otherwise it means that one of its children
+//   pane this means the next cell of the terminal. Otherwise, it means that one of its children
 //   advances (recursively). It expects the given node and its descendants to have either
 //   already snapped or minimum size.
 // Arguments:
-// - widthOrHeight: if true operates on width, otherwise on height.
+// - widthOrHeight: if true operates on width; otherwise, on height.
 // - sizeNode: a layout size node that corresponds to this pane.
 // Return Value:
 // - <none>
@@ -2877,7 +2877,7 @@ Size Pane::_GetMinSize() const
 // - Builds a tree of LayoutSizeNode that matches the tree of panes. Each node
 //   has minimum size that the corresponding pane can have.
 // Arguments:
-// - widthOrHeight: if true operates on width, otherwise on height
+// - widthOrHeight: if true operates on width; otherwise, on height
 // Return Value:
 // - Root node of built tree that matches this pane.
 Pane::LayoutSizeNode Pane::_CreateMinSizeTree(const bool widthOrHeight) const
@@ -2897,7 +2897,7 @@ Pane::LayoutSizeNode Pane::_CreateMinSizeTree(const bool widthOrHeight) const
 // - Adjusts split position so that no child pane is smaller then its
 //   minimum size
 // Arguments:
-// - widthOrHeight: if true, operates on width, otherwise on height.
+// - widthOrHeight: if true, operates on width; otherwise, on height.
 // - requestedValue: split position value to be clamped
 // - totalSize: size (width or height) of the parent pane
 // Return Value:
diff --git a/src/cascadia/TerminalApp/ShortcutActionDispatch.cpp b/src/cascadia/TerminalApp/ShortcutActionDispatch.cpp
index 28cb64b5aad..fe03a94f78b 100644
--- a/src/cascadia/TerminalApp/ShortcutActionDispatch.cpp
+++ b/src/cascadia/TerminalApp/ShortcutActionDispatch.cpp
@@ -27,7 +27,7 @@ namespace winrt::TerminalApp::implementation
     // Arguments:
     // - actionAndArgs: the ShortcutAction and associated args to raise an event for.
     // Return Value:
-    // - true if we handled the event was handled, else false.
+    // - true if the event was handled, else false.
     bool ShortcutActionDispatch::DoAction(const winrt::Windows::Foundation::IInspectable& sender,
                                           const ActionAndArgs& actionAndArgs)
     {
diff --git a/src/cascadia/TerminalApp/SuggestionsControl.cpp b/src/cascadia/TerminalApp/SuggestionsControl.cpp
index 3ebc7ca1583..ed2bb3f6868 100644
--- a/src/cascadia/TerminalApp/SuggestionsControl.cpp
+++ b/src/cascadia/TerminalApp/SuggestionsControl.cpp
@@ -421,7 +421,7 @@ namespace winrt::TerminalApp::implementation
         }
         else if (key == VirtualKey::Escape)
         {
-            // Dismiss the palette if the text is empty, otherwise clear the
+            // Dismiss the palette if the text is empty; otherwise, clear the
             // search string.
             if (_searchBox().Text().empty())
             {
diff --git a/src/cascadia/TerminalApp/TerminalPage.cpp b/src/cascadia/TerminalApp/TerminalPage.cpp
index 810ce5272b6..f900e05cb77 100644
--- a/src/cascadia/TerminalApp/TerminalPage.cpp
+++ b/src/cascadia/TerminalApp/TerminalPage.cpp
@@ -1289,7 +1289,7 @@ namespace winrt::TerminalApp::implementation
             //
             // We need to do this here, to ensure we tell the ConptyConnection
             // the correct starting path. If we're being invoked from another
-            // terminal instance (e.g. wt -w 0 -d .), then we have switched our
+            // terminal instance (e.g. `wt -w 0 -d .`), then we have switched our
             // CWD to the provided path. We should treat the StartingDirectory
             // as relative to the current CWD.
             //
@@ -3970,7 +3970,7 @@ namespace winrt::TerminalApp::implementation
     // Arguments:
     // - args: the ExecuteCommandlineArgs to synthesize a list of startup actions for.
     // Return Value:
-    // - an empty list if we failed to parse, otherwise a list of actions to execute.
+    // - an empty list if we failed to parse; otherwise, a list of actions to execute.
     std::vector<ActionAndArgs> TerminalPage::ConvertExecuteCommandlineToActions(const ExecuteCommandlineArgs& args)
     {
         ::TerminalApp::AppCommandlineArgs appArgs;
diff --git a/src/cascadia/TerminalApp/TerminalWindow.cpp b/src/cascadia/TerminalApp/TerminalWindow.cpp
index 88a839949ce..c2afef34121 100644
--- a/src/cascadia/TerminalApp/TerminalWindow.cpp
+++ b/src/cascadia/TerminalApp/TerminalWindow.cpp
@@ -327,7 +327,7 @@ namespace winrt::TerminalApp::implementation
     // - Show a ContentDialog with buttons to take further action. Uses the
     //   FrameworkElements provided as the title and content of this dialog, and
     //   displays buttons (or a single button). Two buttons (primary and secondary)
-    //   will be displayed if this is an warning dialog for closing the terminal,
+    //   will be displayed if this is a warning dialog for closing the terminal,
     //   this allows the users to abandon the closing action. Otherwise, a single
     //   close button will be displayed.
     // - Only one dialog can be visible at a time. If another dialog is visible
diff --git a/src/cascadia/TerminalControl/ControlCore.cpp b/src/cascadia/TerminalControl/ControlCore.cpp
index 61d699a6cc9..b2ad7b75491 100644
--- a/src/cascadia/TerminalControl/ControlCore.cpp
+++ b/src/cascadia/TerminalControl/ControlCore.cpp
@@ -619,7 +619,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
     // - vkey: The vkey of the key pressed.
     // - scanCode: The scan code of the key pressed.
     // - modifiers: The Microsoft::Terminal::Core::ControlKeyStates representing the modifier key states.
-    // - keyDown: If true, the key was pressed, otherwise the key was released.
+    // - keyDown: If true, the key was pressed; otherwise, the key was released.
     bool ControlCore::TrySendKeyEvent(const WORD vkey,
                                       const WORD scanCode,
                                       const ControlKeyStates modifiers,
@@ -1357,7 +1357,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
                 return false;
             }
 
-            // use action's copyFormatting if it's present, else fallback to globally
+            // use action's copyFormatting if it's present, else fall back to globally
             // set copyFormatting.
             const auto copyFormats = formats != nullptr ? formats.Value() : _settings->CopyFormatting();
 
diff --git a/src/cascadia/TerminalControl/ControlInteractivity.h b/src/cascadia/TerminalControl/ControlInteractivity.h
index dcf2c811d02..02b198a77a4 100644
--- a/src/cascadia/TerminalControl/ControlInteractivity.h
+++ b/src/cascadia/TerminalControl/ControlInteractivity.h
@@ -104,7 +104,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
         //
         // ControlCore::AttachUiaEngine receives a IRenderEngine as a raw pointer, which we own.
         // We must ensure that we first destroy the ControlCore before the UiaEngine instance
-        // in order to safely resolve this unsafe pointer dependency. Otherwise a deallocated
+        // in order to safely resolve this unsafe pointer dependency. Otherwise, a deallocated
         // IRenderEngine is accessed when ControlCore calls Renderer::TriggerTeardown.
         // (C++ class members are destroyed in reverse order.)
         std::unique_ptr<::Microsoft::Console::Render::UiaEngine> _uiaEngine;
diff --git a/src/cascadia/TerminalControl/HwndTerminalAutomationPeer.cpp b/src/cascadia/TerminalControl/HwndTerminalAutomationPeer.cpp
index 6eae42a665a..92724a2c675 100644
--- a/src/cascadia/TerminalControl/HwndTerminalAutomationPeer.cpp
+++ b/src/cascadia/TerminalControl/HwndTerminalAutomationPeer.cpp
@@ -45,7 +45,7 @@ static std::wstring Sanitize(std::wstring_view text)
 // Arguments:
 // - text: the string we're validating
 // Return Value:
-// - true, if the text is readable. false, otherwise.
+// - true, if the text is readable; otherwise, false.
 static constexpr bool IsReadable(std::wstring_view text)
 {
     for (const auto c : text)
diff --git a/src/cascadia/TerminalControl/TermControl.cpp b/src/cascadia/TerminalControl/TermControl.cpp
index 67809d4cea9..ea8446f04ec 100644
--- a/src/cascadia/TerminalControl/TermControl.cpp
+++ b/src/cascadia/TerminalControl/TermControl.cpp
@@ -1033,7 +1033,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
     // - Set up each layer's brush used to display the control's background.
     // - Respects the settings for acrylic, background image and opacity from
     //   _settings.
-    //   * If acrylic is not enabled, setup a solid color background, otherwise
+    //   * If acrylic is not enabled, set up a solid color background; otherwise,
     //       use bgcolor as acrylic's tint
     // - Avoids image flickering and acrylic brush redraw if settings are changed
     //   but the appropriate brush is still in place.
@@ -1898,7 +1898,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
     // - vkey: The vkey of the key pressed.
     // - scanCode: The scan code of the key pressed.
     // - states: The Microsoft::Terminal::Core::ControlKeyStates representing the modifier key states.
-    // - keyDown: If true, the key was pressed, otherwise the key was released.
+    // - keyDown: If true, the key was pressed; otherwise, the key was released.
     bool TermControl::_TrySendKeyEvent(const WORD vkey,
                                        const WORD scanCode,
                                        const ControlKeyStates modifiers,
@@ -2982,7 +2982,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
     // - Adjusts given dimension (width or height) so that it aligns to the character grid.
     //   The snap is always downward.
     // Arguments:
-    // - widthOrHeight: if true operates on width, otherwise on height
+    // - widthOrHeight: if true operates on width; otherwise, on height
     // - dimension: a dimension (width or height) to be snapped
     // Return Value:
     // - A dimension that would be aligned to the character grid.
diff --git a/src/cascadia/TerminalControl/TermControl.h b/src/cascadia/TerminalControl/TermControl.h
index 7fe3db1be09..2f9dad97848 100644
--- a/src/cascadia/TerminalControl/TermControl.h
+++ b/src/cascadia/TerminalControl/TermControl.h
@@ -242,7 +242,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
         //
         // ControlCore::AttachUiaEngine receives a IRenderEngine as a raw pointer, which we own.
         // We must ensure that we first destroy the ControlCore before the UiaEngine instance
-        // in order to safely resolve this unsafe pointer dependency. Otherwise a deallocated
+        // in order to safely resolve this unsafe pointer dependency. Otherwise, a deallocated
         // IRenderEngine is accessed when ControlCore calls Renderer::TriggerTeardown.
         // (C++ class members are destroyed in reverse order.)
         // Further, the TermControlAutomationPeer must be destructed after _uiaEngine!
diff --git a/src/cascadia/TerminalControl/TermControlAutomationPeer.cpp b/src/cascadia/TerminalControl/TermControlAutomationPeer.cpp
index 1adb9af5ce5..90ad7b98769 100644
--- a/src/cascadia/TerminalControl/TermControlAutomationPeer.cpp
+++ b/src/cascadia/TerminalControl/TermControlAutomationPeer.cpp
@@ -52,7 +52,7 @@ static std::wstring Sanitize(std::wstring_view text)
 // Arguments:
 // - text: the string we're validating
 // Return Value:
-// - true, if the text is readable. false, otherwise.
+// - true, if the text is readable; otherwise, false.
 static constexpr bool IsReadable(std::wstring_view text)
 {
     for (const auto c : text)
@@ -305,7 +305,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
 
     hstring TermControlAutomationPeer::GetNameCore() const
     {
-        // fallback to title if profile name is empty
+        // fall back to title if profile name is empty
         if (auto control{ _termControl.get() })
         {
             const auto profileName = control->GetProfileName();
diff --git a/src/cascadia/TerminalCore/Terminal.cpp b/src/cascadia/TerminalCore/Terminal.cpp
index 005916822dc..b292fd813b6 100644
--- a/src/cascadia/TerminalCore/Terminal.cpp
+++ b/src/cascadia/TerminalCore/Terminal.cpp
@@ -469,7 +469,7 @@ void Terminal::TrySnapOnInput()
 // Parameters:
 // - <none>
 // Return value:
-// - true, if we are tracking mouse input. False, otherwise
+// - true, if we are tracking mouse input; otherwise, false.
 bool Terminal::IsTrackingMouseInput() const noexcept
 {
     return _getTerminalInput().IsTrackingMouseInput();
@@ -482,7 +482,7 @@ bool Terminal::IsTrackingMouseInput() const noexcept
 // Parameters:
 // - <none>
 // Return value:
-// - true, if we are tracking mouse input. False, otherwise
+// - true, if we are tracking mouse input; otherwise, false.
 bool Terminal::ShouldSendAlternateScroll(const unsigned int uiButton,
                                          const int32_t delta) const noexcept
 {
@@ -599,7 +599,7 @@ std::optional<PointTree::interval> Terminal::GetHyperlinkIntervalFromViewportPos
 // - vkey: The vkey of the last pressed key.
 // - scanCode: The scan code of the last pressed key.
 // - states: The Microsoft::Terminal::Core::ControlKeyStates representing the modifier key states.
-// - keyDown: If true, the key was pressed, otherwise the key was released.
+// - keyDown: If true, the key was pressed; otherwise, the key was released.
 // Return Value:
 // - true if we translated the key event, and it should not be processed any further.
 // - false if we did not translate the key, and it should be processed into a character.
@@ -921,7 +921,7 @@ void Terminal::_StoreKeyEvent(const WORD vkey, const WORD scanCode) noexcept
 // Arguments:
 // - scanCode: The scan code.
 // Return Value:
-// - The key code matching the given scan code. Otherwise 0.
+// - The key code matching the given scan code. Otherwise, 0.
 WORD Terminal::_TakeVirtualKeyFromLastKeyEvent(const WORD scanCode) noexcept
 {
     const auto codes = _lastKeyEventCodes.value_or(KeyEventCodes{});
diff --git a/src/cascadia/TerminalCore/TerminalApi.cpp b/src/cascadia/TerminalCore/TerminalApi.cpp
index 7d8a7062740..9822d682086 100644
--- a/src/cascadia/TerminalCore/TerminalApi.cpp
+++ b/src/cascadia/TerminalCore/TerminalApi.cpp
@@ -377,7 +377,7 @@ void Terminal::NotifyBufferRotation(const int delta)
         auto selection{ _selection.write() };
         wil::hide_name _selection;
         // If the end of the selection will be out of range after the move, we just
-        // clear the selection. Otherwise we move both the start and end points up
+        // clear the selection. Otherwise, we move both the start and end points up
         // by the given delta and clamp to the first row.
         if (selection->end.y < delta)
         {
diff --git a/src/cascadia/TerminalCore/TerminalSelection.cpp b/src/cascadia/TerminalCore/TerminalSelection.cpp
index d588b67cb0e..f0019d66143 100644
--- a/src/cascadia/TerminalCore/TerminalSelection.cpp
+++ b/src/cascadia/TerminalCore/TerminalSelection.cpp
@@ -438,7 +438,7 @@ void Terminal::ExpandSelectionToWord()
 // Arguments:
 // - dir: the direction we're scanning the buffer in to find the hyperlink of interest
 // Return Value:
-// - true if we found a hyperlink to select (and selected it). False otherwise.
+// - true if we found a hyperlink to select (and selected it); otherwise, false.
 void Terminal::SelectHyperlink(const SearchDirection dir)
 {
     if (_selectionMode != SelectionInteractionMode::Mark)
diff --git a/src/cascadia/TerminalSettingsEditor/MainPage.cpp b/src/cascadia/TerminalSettingsEditor/MainPage.cpp
index b5fdc867b66..6f9c460797c 100644
--- a/src/cascadia/TerminalSettingsEditor/MainPage.cpp
+++ b/src/cascadia/TerminalSettingsEditor/MainPage.cpp
@@ -258,7 +258,7 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
             }
         }
 
-        // Couldn't find the selected item, fallback to first menu item
+        // Couldn't find the selected item, fall back to first menu item
         // This happens when the selected item was a profile which doesn't exist in the new configuration
         // We can use menuItemsSTL here because the only things they miss are profile entries.
         const auto& firstItem{ _menuItemSource.GetAt(0).as<MUX::Controls::NavigationViewItem>() };
diff --git a/src/cascadia/TerminalSettingsModel/ActionMap.cpp b/src/cascadia/TerminalSettingsModel/ActionMap.cpp
index 577903edc0c..730e6463101 100644
--- a/src/cascadia/TerminalSettingsModel/ActionMap.cpp
+++ b/src/cascadia/TerminalSettingsModel/ActionMap.cpp
@@ -137,7 +137,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation
     // Arguments:
     // - actionID: the internal ID associated with a Command
     // Return Value:
-    // - The command if it exists in this layer, otherwise nullptr
+    // - The command if it exists in this layer; otherwise, nullptr
     Model::Command ActionMap::_GetActionByID(const winrt::hstring& actionID) const
     {
         // Check current layer
@@ -692,7 +692,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation
     // - oldKeys: the key binding that we are rebinding
     // - newKeys: the new key chord that is being used to replace oldKeys
     // Return Value:
-    // - true, if successful. False, otherwise.
+    // - true, if successful; otherwise, false.
     bool ActionMap::RebindKeys(const Control::KeyChord& oldKeys, const Control::KeyChord& newKeys)
     {
         const auto cmd{ GetActionByKeyChord(oldKeys) };
diff --git a/src/cascadia/TerminalSettingsModel/CascadiaSettingsSerialization.cpp b/src/cascadia/TerminalSettingsModel/CascadiaSettingsSerialization.cpp
index bbbb9172c7f..16f71dd1304 100644
--- a/src/cascadia/TerminalSettingsModel/CascadiaSettingsSerialization.cpp
+++ b/src/cascadia/TerminalSettingsModel/CascadiaSettingsSerialization.cpp
@@ -1014,7 +1014,7 @@ void SettingsLoader::_appendProfile(winrt::com_ptr<Profile>&& profile, const win
 }
 
 // If the given ParsedSettings instance contains a profile with the given profile's GUID,
-// the profile is added as a parent. Otherwise a new child profile is created.
+// the profile is added as a parent. Otherwise, a new child profile is created.
 void SettingsLoader::_addUserProfileParent(const winrt::com_ptr<implementation::Profile>& profile)
 {
     if (const auto [it, inserted] = userSettings.profilesByGuid.emplace(profile->Guid(), nullptr); !inserted)
diff --git a/src/cascadia/TerminalSettingsModel/Command.cpp b/src/cascadia/TerminalSettingsModel/Command.cpp
index 7ec4d073747..d1ea74cfd59 100644
--- a/src/cascadia/TerminalSettingsModel/Command.cpp
+++ b/src/cascadia/TerminalSettingsModel/Command.cpp
@@ -165,7 +165,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation
     // Arguments:
     // - json: The Json::Value representing the command object we should get the name for.
     // Return Value:
-    // - the empty string if we couldn't find a name, otherwise the command's name.
+    // - the empty string if we couldn't find a name; otherwise, the command's name.
     static std::optional<std::wstring> _nameFromJson(const Json::Value& json)
     {
         if (const auto name{ json[JsonKey(NameKey)] })
@@ -489,7 +489,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation
     // - expandable: the Command to potentially turn into more commands
     // - profiles: A list of all the profiles that this command should be expanded on.
     // Return Value:
-    // - and empty vector if the command wasn't expandable, otherwise a list of
+    // - and empty vector if the command wasn't expandable; otherwise, a list of
     //   the newly-created commands.
     std::vector<Model::Command> Command::_expandCommand(Command* const expandable,
                                                         IVectorView<Model::Profile> profiles,
diff --git a/src/cascadia/TerminalSettingsModel/JsonUtils.h b/src/cascadia/TerminalSettingsModel/JsonUtils.h
index ab2b93ce964..ef3256f426a 100644
--- a/src/cascadia/TerminalSettingsModel/JsonUtils.h
+++ b/src/cascadia/TerminalSettingsModel/JsonUtils.h
@@ -89,7 +89,7 @@ namespace Microsoft::Terminal::Settings::Model::JsonUtils
     {
         static constexpr std::optional<T> EmptyV() { return std::nullopt; }
         static constexpr bool HasValue(const std::optional<T>& o) { return o.has_value(); }
-        // We can return a reference here because the original value is stored inside an std::optional
+        // We can return a reference here because the original value is stored inside a std::optional
         static constexpr auto&& Value(const std::optional<T>& o) { return *o; }
     };
 
diff --git a/src/cascadia/TerminalSettingsModel/Profile.cpp b/src/cascadia/TerminalSettingsModel/Profile.cpp
index d1b2efb08ba..1e5c61089a3 100644
--- a/src/cascadia/TerminalSettingsModel/Profile.cpp
+++ b/src/cascadia/TerminalSettingsModel/Profile.cpp
@@ -310,7 +310,7 @@ std::wstring Profile::EvaluateStartingDirectory(const std::wstring& directory)
 }
 
 // Function Description:
-// - Generates a unique guid for a profile, given the name. For an given name, will always return the same GUID.
+// - Generates a unique guid for a profile, given the name. For a given name, will always return the same GUID.
 // Arguments:
 // - name: The name to generate a unique GUID from
 // Return Value:
diff --git a/src/cascadia/TerminalSettingsModel/TerminalSettings.cpp b/src/cascadia/TerminalSettingsModel/TerminalSettings.cpp
index ff9860aef6b..9d3540b1458 100644
--- a/src/cascadia/TerminalSettingsModel/TerminalSettings.cpp
+++ b/src/cascadia/TerminalSettingsModel/TerminalSettings.cpp
@@ -305,7 +305,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation
 
         _StartingDirectory = profile.EvaluatedStartingDirectory();
 
-        // GH#2373: Use the tabTitle as the starting title if it exists, otherwise
+        // GH#2373: Use the tabTitle as the starting title if it exists; otherwise,
         // use the profile name
         _StartingTitle = !profile.TabTitle().empty() ? profile.TabTitle() : profile.Name();
 
diff --git a/src/cascadia/TerminalSettingsModel/Theme.cpp b/src/cascadia/TerminalSettingsModel/Theme.cpp
index 90fd1d1a760..3b79b5297d7 100644
--- a/src/cascadia/TerminalSettingsModel/Theme.cpp
+++ b/src/cascadia/TerminalSettingsModel/Theme.cpp
@@ -372,7 +372,7 @@ winrt::hstring Theme::ToString()
 //   RequestedTheme, this saves some hassle. If there wasn't a `window` defined
 //   for this theme, this'll quickly just return `system`, to use the OS theme.
 // Return Value:
-// - the set applicationTheme for this Theme, otherwise the system theme.
+// - the set applicationTheme for this Theme; otherwise, the system theme.
 winrt::WUX::ElementTheme Theme::RequestedTheme() const noexcept
 {
     return _Window ? _Window.RequestedTheme() : winrt::WUX::ElementTheme::Default;
diff --git a/src/cascadia/WindowsTerminal/AppHost.cpp b/src/cascadia/WindowsTerminal/AppHost.cpp
index 6cdc7ff8e72..1e388f0f32e 100644
--- a/src/cascadia/WindowsTerminal/AppHost.cpp
+++ b/src/cascadia/WindowsTerminal/AppHost.cpp
@@ -951,7 +951,7 @@ void AppHost::_updateTheme()
     _window->UseDarkTheme(_isActuallyDarkTheme(theme.RequestedTheme()));
 
     // Update the window frame. If `rainbowFrame:true` is enabled, then that
-    // will be used. Otherwise we'll try to use the `FrameBrush` set in the
+    // will be used. Otherwise, we'll try to use the `FrameBrush` set in the
     // terminal window, as that will have the right color for the ThemeColor for
     // this setting. If that value is null, then revert to the default frame
     // color.
diff --git a/src/cascadia/WindowsTerminal/NonClientIslandWindow.cpp b/src/cascadia/WindowsTerminal/NonClientIslandWindow.cpp
index 414e4043f88..95d971ecea1 100644
--- a/src/cascadia/WindowsTerminal/NonClientIslandWindow.cpp
+++ b/src/cascadia/WindowsTerminal/NonClientIslandWindow.cpp
@@ -692,7 +692,7 @@ int NonClientIslandWindow::_GetResizeHandleHeight() const noexcept
             // If there's a taskbar on any side of the monitor, reduce our size
             // a little bit on that edge.
             //
-            // Note to future code archeologists:
+            // Note to future code archaeologists:
             // This doesn't seem to work for fullscreen on the primary display.
             // However, testing a bunch of other apps with fullscreen modes
             // and an auto-hiding taskbar has shown that _none_ of them
diff --git a/src/cascadia/WpfTerminalControl/TerminalControl.xaml.cs b/src/cascadia/WpfTerminalControl/TerminalControl.xaml.cs
index ab6a26d460a..611cde52a6f 100644
--- a/src/cascadia/WpfTerminalControl/TerminalControl.xaml.cs
+++ b/src/cascadia/WpfTerminalControl/TerminalControl.xaml.cs
@@ -103,7 +103,7 @@ public void SetTheme(TerminalTheme theme, string fontFamily, short fontSize, Col
         }
 
         /// <summary>
-        /// Gets the selected text in the terminal, clearing the selection. Otherwise returns an empty string.
+        /// Gets the selected text in the terminal, clearing the selection. Otherwise, returns an empty string.
         /// </summary>
         /// <returns>Selected text, empty string if no content is selected.</returns>
         public string GetSelectedText()
diff --git a/src/host/ConsoleArguments.cpp b/src/host/ConsoleArguments.cpp
index d1ecdcb2b16..8241a62e0b2 100644
--- a/src/host/ConsoleArguments.cpp
+++ b/src/host/ConsoleArguments.cpp
@@ -182,7 +182,7 @@ void ConsoleArguments::s_ConsumeArg(_Inout_ std::vector<std::wstring>& args, _In
 //      should be at (index+1). index will be decremented by one on success.
 //  pSetting: receives the string at index+1
 // Return Value:
-//  S_OK if we parsed the string successfully, otherwise E_INVALIDARG indicating
+//  S_OK if we parsed the string successfully; otherwise, E_INVALIDARG indicating
 //      failure.
 [[nodiscard]] HRESULT ConsoleArguments::s_GetArgumentValue(_Inout_ std::vector<std::wstring>& args,
                                                            _Inout_ size_t& index,
@@ -213,7 +213,7 @@ void ConsoleArguments::s_ConsumeArg(_Inout_ std::vector<std::wstring>& args, _In
 //      should be at (index+1). index will be decremented by one on success.
 //  pSetting: receives the string at index+1
 // Return Value:
-//  S_OK if we parsed the string successfully, otherwise E_INVALIDARG indicating
+//  S_OK if we parsed the string successfully; otherwise, E_INVALIDARG indicating
 //      failure.
 [[nodiscard]] HRESULT ConsoleArguments::s_HandleFeatureValue(_Inout_ std::vector<std::wstring>& args, _Inout_ size_t& index)
 {
@@ -243,7 +243,7 @@ void ConsoleArguments::s_ConsumeArg(_Inout_ std::vector<std::wstring>& args, _In
 //      should be at (index+1). index will be decremented by one on success.
 //  pSetting: receives the short at index+1
 // Return Value:
-//  S_OK if we parsed the short successfully, otherwise E_INVALIDARG indicating
+//  S_OK if we parsed the short successfully; otherwise, E_INVALIDARG indicating
 //      failure. This could be the case for non-numeric arguments, or for >SHORT_MAX args.
 [[nodiscard]] HRESULT ConsoleArguments::s_GetArgumentValue(_Inout_ std::vector<std::wstring>& args,
                                                            _Inout_ size_t& index,
@@ -332,7 +332,7 @@ void ConsoleArguments::s_ConsumeArg(_Inout_ std::vector<std::wstring>& args, _In
 //  index: the index of the argument of which to start the commandline from.
 //  skipFirst: if true, omit the arg at index (which should be "--")
 // Return Value:
-//  S_OK if we parsed the string successfully, otherwise E_INVALIDARG indicating
+//  S_OK if we parsed the string successfully; otherwise, E_INVALIDARG indicating
 //       failure.
 [[nodiscard]] HRESULT ConsoleArguments::_GetClientCommandline(_Inout_ std::vector<std::wstring>& args, const size_t index, const bool skipFirst)
 {
@@ -369,7 +369,7 @@ void ConsoleArguments::s_ConsumeArg(_Inout_ std::vector<std::wstring>& args, _In
 // Arguments:
 //  <none>
 // Return Value:
-//  S_OK if we parsed our _commandline successfully, otherwise E_INVALIDARG
+//  S_OK if we parsed our _commandline successfully; otherwise, E_INVALIDARG
 //      indicating failure.
 [[nodiscard]] HRESULT ConsoleArguments::ParseCommandline()
 {
diff --git a/src/host/VtIo.cpp b/src/host/VtIo.cpp
index be1d8bd3302..53911496a05 100644
--- a/src/host/VtIo.cpp
+++ b/src/host/VtIo.cpp
@@ -73,7 +73,7 @@ using namespace Microsoft::Console::Interactivity;
 //  SignalHandle: an optional file handle that will be used to send signals into the console.
 //      This represents the ability to send signals to a *nix tty/pty.
 // Return Value:
-//  S_OK if we initialized successfully, otherwise an appropriate HRESULT
+//  S_OK if we initialized successfully; otherwise, an appropriate HRESULT
 //      indicating failure.
 [[nodiscard]] HRESULT VtIo::_Initialize(const HANDLE InHandle,
                                         const HANDLE OutHandle,
@@ -136,7 +136,7 @@ bool VtIo::IsUsingVt() const
 // Arguments:
 //  <none>
 // Return Value:
-//  S_OK if we started successfully or had nothing to start, otherwise an
+//  S_OK if we started successfully or had nothing to start; otherwise, an
 //      appropriate HRESULT indicating failure.
 [[nodiscard]] HRESULT VtIo::StartIfNeeded()
 {
@@ -361,7 +361,7 @@ void VtIo::FormatAttributes(std::wstring& target, const TextAttribute& attribute
 wchar_t VtIo::SanitizeUCS2(wchar_t ch)
 {
     // If any of the values in the buffer are C0 or C1 controls, we need to
-    // convert them to printable codepoints, otherwise they'll end up being
+    // convert them to printable codepoints; otherwise, they'll end up being
     // evaluated as control characters by the receiving terminal. We use the
     // DOS 437 code page for the C0 controls and DEL, and just a `?` for the
     // C1 controls, since that's what you would most likely have seen in the
diff --git a/src/host/exe/exemain.cpp b/src/host/exe/exemain.cpp
index 2b95ba09164..054cdea490f 100644
--- a/src/host/exe/exemain.cpp
+++ b/src/host/exe/exemain.cpp
@@ -175,7 +175,7 @@ static bool ShouldUseLegacyConhost(const ConsoleArguments& args)
     {
         // setup status error
         hr = HRESULT_FROM_WIN32(GetLastError());
-        // fallback to V2 if conhostv1.dll cannot be loaded.
+        // fall back to V2 if conhostv1.dll cannot be loaded.
         useV2 = true;
     }
 
diff --git a/src/host/ft_host/API_AliasTestsHelpers.hpp b/src/host/ft_host/API_AliasTestsHelpers.hpp
index 9e2f751e7a8..49dd8eb2215 100644
--- a/src/host/ft_host/API_AliasTestsHelpers.hpp
+++ b/src/host/ft_host/API_AliasTestsHelpers.hpp
@@ -233,7 +233,7 @@ void TestGetConsoleAliasHelper(TCH* ptszSourceGiven,
 
     if (0 == dwExpectedLastError)
     {
-        // If it was successful, it should have been filled. Otherwise it will be zeroed as when it started.
+        // If it was successful, it should have been filled. Otherwise, it will be zeroed as when it started.
         StringCbCopyT(ptchExpectedTarget, cbTargetBuffer, ptszExpectedTargetGiven);
     }
 
diff --git a/src/host/outputStream.cpp b/src/host/outputStream.cpp
index 9107413e7e1..5fc568d456a 100644
--- a/src/host/outputStream.cpp
+++ b/src/host/outputStream.cpp
@@ -84,7 +84,7 @@ void ConhostInternalGetSet::SetViewportPosition(const til::point position)
     THROW_IF_FAILED(info.SetViewportOrigin(true, position, true));
     // SetViewportOrigin() only updates the virtual bottom (the bottom coordinate of the area
     // in the text buffer a VT client writes its output into) when it's moving downwards.
-    // But this function is meant to truly move the viewport no matter what. Otherwise `tput reset` breaks.
+    // But this function is meant to truly move the viewport no matter what. Otherwise, `tput reset` breaks.
     info.UpdateBottom();
 }
 
diff --git a/src/host/readDataCooked.cpp b/src/host/readDataCooked.cpp
index ea086b12301..c7d82fae0b4 100644
--- a/src/host/readDataCooked.cpp
+++ b/src/host/readDataCooked.cpp
@@ -184,7 +184,7 @@ COOKED_READ_DATA::COOKED_READ_DATA(_In_ InputBuffer* const pInputBuffer,
 // - It may be called more than once.
 // Arguments:
 // - TerminationReason - if this routine is called because a ctrl-c or ctrl-break was seen, this argument
-//                      contains CtrlC or CtrlBreak. If the owning thread is exiting, it will have ThreadDying. Otherwise 0.
+//                      contains CtrlC or CtrlBreak. If the owning thread is exiting, it will have ThreadDying. Otherwise, 0.
 // - fIsUnicode - Whether to convert the final data to A (using Console Input CP) at the end or treat everything as Unicode (UCS-2)
 // - pReplyStatus - The status code to return to the client application that originally called the API (before it was queued to wait)
 // - pNumBytes - The number of bytes of data that the server/driver will need to transmit back to the client process
diff --git a/src/host/readDataDirect.cpp b/src/host/readDataDirect.cpp
index 5009817763b..ef365570936 100644
--- a/src/host/readDataDirect.cpp
+++ b/src/host/readDataDirect.cpp
@@ -36,7 +36,7 @@ DirectReadData::DirectReadData(_In_ InputBuffer* const pInputBuffer,
 // Arguments:
 // - TerminationReason - if this routine is called because a ctrl-c or
 // ctrl-break was seen, this argument contains CtrlC or CtrlBreak. If
-// the owning thread is exiting, it will have ThreadDying. Otherwise 0.
+// the owning thread is exiting, it will have ThreadDying. Otherwise, 0.
 // - fIsUnicode - Should we return UCS-2 unicode data, or should we
 // run the final data through the current Input Codepage before
 // returning?
diff --git a/src/host/readDataRaw.cpp b/src/host/readDataRaw.cpp
index 9351382c074..8c83143244e 100644
--- a/src/host/readDataRaw.cpp
+++ b/src/host/readDataRaw.cpp
@@ -48,7 +48,7 @@ RAW_READ_DATA::~RAW_READ_DATA() = default;
 // Arguments:
 // - TerminationReason - if this routine is called because a ctrl-c or
 // ctrl-break was seen, this argument contains CtrlC or CtrlBreak. If
-// the owning thread is exiting, it will have ThreadDying. Otherwise 0.
+// the owning thread is exiting, it will have ThreadDying. Otherwise, 0.
 // - fIsUnicode - Whether to convert the final data to A (using
 // Console Input CP) at the end or treat everything as Unicode (UCS-2)
 // - pReplyStatus - The status code to return to the client
diff --git a/src/host/screenInfo.cpp b/src/host/screenInfo.cpp
index 3e1ae49d4b3..3fe3b7b8597 100644
--- a/src/host/screenInfo.cpp
+++ b/src/host/screenInfo.cpp
@@ -1221,7 +1221,7 @@ void SCREEN_INFORMATION::_AdjustViewportSize(const til::rect* const prcClientNew
                                              const til::size* const pcoordSize)
 {
     // If the left is the only one that changed (and not the right
-    // also), then adjust from the left. Otherwise if the right
+    // also), then adjust from the left. Otherwise, if the right
     // changes or both changed, bias toward leaving the top-left
     // corner in place and resize from the bottom right.
     // --
@@ -2407,7 +2407,7 @@ const FontInfo& SCREEN_INFORMATION::GetCurrentFont() const noexcept
 
 // Method Description:
 // - Gets the desired font of the screen buffer. If we try loading this font and
-//      have to fallback to another, then GetCurrentFont()!=GetDesiredFont().
+//      have to fall back to another, then GetCurrentFont()!=GetDesiredFont().
 //      We store this separately, so that if we need to reload the font, we can
 //      try again with our preferred font info (in the desired font info) instead
 //      of re-using the looked up value from before.
diff --git a/src/host/selection.cpp b/src/host/selection.cpp
index d7dcf21ebe2..5bc077e9aba 100644
--- a/src/host/selection.cpp
+++ b/src/host/selection.cpp
@@ -415,7 +415,7 @@ void Selection::ClearSelection(const bool fStartingNewSelection)
         // If we were using alternate selection, cancel it here before starting a new area.
         d->fUseAlternateSelection = false;
 
-        // Only unblock if we're not immediately starting a new selection. Otherwise stay blocked.
+        // Only unblock if we're not immediately starting a new selection. Otherwise, stay blocked.
         if (!fStartingNewSelection)
         {
             UnblockWriteConsole(CONSOLE_SELECTING);
diff --git a/src/host/ut_host/ConsoleArgumentsTests.cpp b/src/host/ut_host/ConsoleArgumentsTests.cpp
index a9148dfd2e5..b03b9099dbf 100644
--- a/src/host/ut_host/ConsoleArgumentsTests.cpp
+++ b/src/host/ut_host/ConsoleArgumentsTests.cpp
@@ -812,7 +812,7 @@ void ConsoleArgumentsTests::InitialSizeTests()
                    true); // successful parse?
 
     commandline = L"conhost.exe --width foo";
-    ArgTestsRunner(L"#6 look for an ivalid commandline passing a string",
+    ArgTestsRunner(L"#6 look for an invalid commandline passing a string",
                    commandline,
                    INVALID_HANDLE_VALUE,
                    INVALID_HANDLE_VALUE,
@@ -833,7 +833,7 @@ void ConsoleArgumentsTests::InitialSizeTests()
                    false); // successful parse?
 
     commandline = L"conhost.exe --width 2foo";
-    ArgTestsRunner(L"#7 look for an ivalid commandline passing a string with a number at the start",
+    ArgTestsRunner(L"#7 look for an invalid commandline passing a string with a number at the start",
                    commandline,
                    INVALID_HANDLE_VALUE,
                    INVALID_HANDLE_VALUE,
@@ -854,7 +854,7 @@ void ConsoleArgumentsTests::InitialSizeTests()
                    false); // successful parse?
 
     commandline = L"conhost.exe --width 65535";
-    ArgTestsRunner(L"#7 look for an ivalid commandline passing a value that's too big",
+    ArgTestsRunner(L"#7 look for an invalid commandline passing a value that's too big",
                    commandline,
                    INVALID_HANDLE_VALUE,
                    INVALID_HANDLE_VALUE,
diff --git a/src/host/ut_host/ScreenBufferTests.cpp b/src/host/ut_host/ScreenBufferTests.cpp
index 77b0f303cfb..943d3199db6 100644
--- a/src/host/ut_host/ScreenBufferTests.cpp
+++ b/src/host/ut_host/ScreenBufferTests.cpp
@@ -5982,7 +5982,7 @@ void ScreenBufferTests::ClearAlternateBuffer()
 
         auto useMain = wil::scope_exit([&] { altBuffer.UseMainScreenBuffer(); });
 
-        // Set the position to home, otherwise it's inherited from the main buffer.
+        // Set the position to home; otherwise, it's inherited from the main buffer.
         VERIFY_SUCCEEDED(altBuffer.SetCursorPosition({ 0, 0 }, true));
 
         WriteText(altBuffer.GetTextBuffer());
diff --git a/src/host/utils.cpp b/src/host/utils.cpp
index d5ac1fc90d4..292450ca5b3 100644
--- a/src/host/utils.cpp
+++ b/src/host/utils.cpp
@@ -124,7 +124,7 @@ UINT s_LoadStringEx(_In_ HINSTANCE hModule, _In_ UINT wID, _Out_writes_(cchBuffe
                 lpsz += cch; // Step to start if next string
             }
 
-            // chhBufferMax == 0 means return a pointer to the read-only resource buffer.
+            // cchBufferMax == 0 means return a pointer to the read-only resource buffer.
             if (cchBufferMax == 0)
             {
                 *(LPTSTR*)lpBuffer = lpsz;
diff --git a/src/host/writeData.cpp b/src/host/writeData.cpp
index 62501554613..51d017bfc0f 100644
--- a/src/host/writeData.cpp
+++ b/src/host/writeData.cpp
@@ -79,7 +79,7 @@ void WriteData::SetUtf8ConsumedCharacters(const size_t cchUtf8Consumed)
 // - Called back at a later time to resume the writing operation when the output object becomes unblocked.
 // Arguments:
 // - TerminationReason - if this routine is called because a ctrl-c or ctrl-break was seen, this argument
-//                      contains CtrlC or CtrlBreak. If the owning thread is exiting, it will have ThreadDying. Otherwise 0.
+//                      contains CtrlC or CtrlBreak. If the owning thread is exiting, it will have ThreadDying. Otherwise, 0.
 // - fIsUnicode - Input data was in UCS-2 unicode or it needs to be converted with the current Output Codepage
 // - pReplyStatus - The status code to return to the client application that originally called the API (before it was queued to wait)
 // - pNumBytes - The number of bytes of data that the server/driver will need to transmit back to the client process
diff --git a/src/inc/til/io.h b/src/inc/til/io.h
index 9e28b996309..bfc9c3bce3f 100644
--- a/src/inc/til/io.h
+++ b/src/inc/til/io.h
@@ -23,7 +23,7 @@ namespace til // Terminal Implementation Library. Also: "Today I Learned"
             // Arguments:
             // - handle: a HANDLE to the file to check
             // Return Value:
-            // - true if it had the expected permissions. False otherwise.
+            // - true if it had the expected permissions; otherwise, false.
             _TIL_INLINEPREFIX bool isOwnedByAdministrators(const HANDLE& handle)
             {
                 // If the file is owned by the administrators group, trust the
diff --git a/src/inc/til/small_vector.h b/src/inc/til/small_vector.h
index 40bc012ff1e..027f0484b5a 100644
--- a/src/inc/til/small_vector.h
+++ b/src/inc/til/small_vector.h
@@ -871,7 +871,7 @@ namespace til
 
             // An optimization for the most common vector type which is trivially and copyable and noexcept constructible.
             // Compared to the complex form below, we don't need the 2 moves and 1 destroy, because is_trivially_copyable_v implies
-            // that we can just memmove() the items in one fell swoop. We don't need a try/catch either because func() is noexcept.
+            // that we can just memmove() the items all at once. We don't need a try/catch either because func() is noexcept.
             if constexpr (noexcept(func(begin())) && std::is_trivially_copyable_v<T>)
             {
                 _size = new_size;
diff --git a/src/interactivity/base/InteractivityFactory.cpp b/src/interactivity/base/InteractivityFactory.cpp
index 8b5647bac63..ecc5c2bc18e 100644
--- a/src/interactivity/base/InteractivityFactory.cpp
+++ b/src/interactivity/base/InteractivityFactory.cpp
@@ -293,7 +293,7 @@ using namespace Microsoft::Console::Interactivity;
 // - hwnd: Receives the value of the newly created window's HWND.
 // - owner: the HWND that should be the initial owner of the pseudo window.
 // Return Value:
-// - STATUS_SUCCESS on success, otherwise an appropriate error.
+// - STATUS_SUCCESS on success; otherwise, an appropriate error.
 [[nodiscard]] NTSTATUS InteractivityFactory::CreatePseudoWindow(HWND& hwnd)
 {
     hwnd = nullptr;
diff --git a/src/interactivity/win32/WindowMetrics.cpp b/src/interactivity/win32/WindowMetrics.cpp
index 637a08feba0..f809ebc48d1 100644
--- a/src/interactivity/win32/WindowMetrics.cpp
+++ b/src/interactivity/win32/WindowMetrics.cpp
@@ -75,7 +75,7 @@ til::rect WindowMetrics::GetMaxWindowRectInPixels()
 // - Gets the maximum possible window rectangle in pixels. Based on the monitor the window is on or the primary monitor if no window exists yet.
 // Arguments:
 // - prcSuggested - If we were given a suggested rectangle for where the window is going, we can pass it in here to find out the max size on that monitor.
-//                - If this value is zero and we had a valid window handle, we'll use that instead. Otherwise the value of 0 will make us use the primary monitor.
+//                - If this value is zero and we had a valid window handle, we'll use that instead. Otherwise, the value of 0 will make us use the primary monitor.
 // - pDpiSuggested - The dpi that matches the suggested rect. We will attempt to compute this during the function, but if we fail for some reason,
 //                 - the original value passed in will be left untouched.
 // Return Value:
diff --git a/src/propsheet/preview.cpp b/src/propsheet/preview.cpp
index 64ed9fae402..9becd7b7038 100644
--- a/src/propsheet/preview.cpp
+++ b/src/propsheet/preview.cpp
@@ -422,7 +422,7 @@ VOID PreviewPaint(
  *          return = n1 * m / n2
  *      This can be used to make an aspect ration calculation where n1/n2
  *      is the aspect ratio and m is a known value.  The return value will
- *      be the value that corresponds to m with the correct apsect ratio.
+ *      be the value that corresponds to m with the correct aspect ratio.
  */
 
 LONG AspectScale(
diff --git a/src/propslib/DelegationConfig.cpp b/src/propslib/DelegationConfig.cpp
index 29339baa2e6..2ba4d85ed57 100644
--- a/src/propslib/DelegationConfig.cpp
+++ b/src/propslib/DelegationConfig.cpp
@@ -293,7 +293,7 @@ try
 
     RETURN_IF_NTSTATUS_FAILED(RegistrySerialization::s_OpenConsoleKey(&currentUserKey, &consoleKey));
 
-    // Create method for registry is a "create if not exists, otherwise open" function.
+    // Create method for registry is a "create if not exists; otherwise, open" function.
     wil::unique_hkey startupKey;
     RETURN_IF_NTSTATUS_FAILED(RegistrySerialization::s_CreateKey(consoleKey.get(), L"%%Startup", &startupKey));
 
diff --git a/src/renderer/atlas/AtlasEngine.cpp b/src/renderer/atlas/AtlasEngine.cpp
index d2e9f8bf26a..6bebd719e84 100644
--- a/src/renderer/atlas/AtlasEngine.cpp
+++ b/src/renderer/atlas/AtlasEngine.cpp
@@ -268,7 +268,7 @@ try
     }
 
     // PaintCursor() is only called when the cursor is visible, but we need to invalidate the cursor area
-    // even if it isn't. Otherwise a transition from a visible to an invisible cursor wouldn't be rendered.
+    // even if it isn't. Otherwise, a transition from a visible to an invisible cursor wouldn't be rendered.
     if (const auto r = _api.invalidatedCursorArea; r.non_empty())
     {
         _p.dirtyRectInPx.left = std::min(_p.dirtyRectInPx.left, r.left * _p.s->font->cellSize.x);
diff --git a/src/renderer/atlas/BackendD3D.cpp b/src/renderer/atlas/BackendD3D.cpp
index 2acb1285917..60ee6aaf1d7 100644
--- a/src/renderer/atlas/BackendD3D.cpp
+++ b/src/renderer/atlas/BackendD3D.cpp
@@ -2324,7 +2324,7 @@ void BackendD3D::_executeCustomShader(RenderingPayload& p)
 
     {
         // Before we do anything else we have to unbound _renderTargetView from being
-        // a render target, otherwise we can't use it as a shader resource below.
+        // a render target; otherwise, we can't use it as a shader resource below.
         p.deviceContext->OMSetRenderTargets(1, _renderTargetView.addressof(), nullptr);
 
         // IA: Input Assembler
diff --git a/src/renderer/atlas/common.h b/src/renderer/atlas/common.h
index 3f70ae6748e..6668e2ce3c4 100644
--- a/src/renderer/atlas/common.h
+++ b/src/renderer/atlas/common.h
@@ -265,7 +265,7 @@ namespace Microsoft::Console::Render::Atlas
 
     private:
         // These two functions don't need to use scoped objects or standard allocators,
-        // since this class is in fact an scoped allocator object itself.
+        // since this class is in fact a scoped allocator object itself.
 #pragma warning(push)
 #pragma warning(disable : 26402) // Return a scoped object instead of a heap-allocated if it has a move constructor (r.3).
 #pragma warning(disable : 26409) // Avoid calling new and delete explicitly, use std::make_unique<T> instead (r.11).
diff --git a/src/renderer/base/renderer.cpp b/src/renderer/base/renderer.cpp
index c923ef8e3fe..9567b8cd49b 100644
--- a/src/renderer/base/renderer.cpp
+++ b/src/renderer/base/renderer.cpp
@@ -1116,7 +1116,7 @@ bool Renderer::_isInHoveredInterval(const til::point coordTarget) const noexcept
 // Arguments:
 // - <none>
 // Return Value:
-// - nullopt if the cursor is off or out-of-frame, otherwise a CursorOptions
+// - nullopt if the cursor is off or out-of-frame; otherwise, a CursorOptions
 void Renderer::_updateCursorInfo()
 {
     // Get cursor position in buffer
diff --git a/src/renderer/gdi/state.cpp b/src/renderer/gdi/state.cpp
index d8f98ef50f0..bf583f78503 100644
--- a/src/renderer/gdi/state.cpp
+++ b/src/renderer/gdi/state.cpp
@@ -560,7 +560,7 @@ GdiEngine::~GdiEngine()
 // Arguments:
 // - newTitle: the new string to use for the title of the window
 // Return Value:
-// -  S_OK if PostMessageW succeeded, otherwise E_FAIL
+// -  S_OK if PostMessageW succeeded; otherwise, E_FAIL
 [[nodiscard]] HRESULT GdiEngine::_DoUpdateTitle(_In_ const std::wstring_view /*newTitle*/) noexcept
 {
     // the CM_UPDATE_TITLE handler in windowproc will query the updated title.
diff --git a/src/server/IoDispatchers.cpp b/src/server/IoDispatchers.cpp
index da082157569..0e5cf60da8c 100644
--- a/src/server/IoDispatchers.cpp
+++ b/src/server/IoDispatchers.cpp
@@ -486,7 +486,7 @@ PCONSOLE_API_MSG IoDispatchers::ConsoleHandleConnectionRequest(_In_ PCONSOLE_API
         return pReceiveMsg;
     }
 
-    // For future code archeologists: GH#2988
+    // For future code archaeologists: GH#2988
     //
     // Here, the console calls ConsoleControl(ConsoleSetForeground,...) with a
     // flag depending on if the console is focused or not. This is surprisingly
diff --git a/src/terminal/adapter/FontBuffer.cpp b/src/terminal/adapter/FontBuffer.cpp
index dabee138f7c..bd0a2e2c942 100644
--- a/src/terminal/adapter/FontBuffer.cpp
+++ b/src/terminal/adapter/FontBuffer.cpp
@@ -259,7 +259,7 @@ void FontBuffer::_prepareCharacterBuffer()
 {
     // If any of the attributes have changed since the last time characters
     // were downloaded, the font dimensions will need to be recalculated, and
-    // the buffer will need to be cleared. Otherwise we'll just be adding to
+    // the buffer will need to be cleared. Otherwise, we'll just be adding to
     // the existing font, assuming the current dimensions.
     if (_cellMatrix != _pendingCellMatrix ||
         _cellHeight != _pendingCellHeight ||
@@ -316,7 +316,7 @@ void FontBuffer::_addSixelValue(const VTInt value) noexcept
 {
     if (_currentChar < MAX_CHARS && _sixelColumn < _textWidth)
     {
-        // Each sixel updates six pixels of a single column, so we setup a bit
+        // Each sixel updates six pixels of a single column, so we set up a bit
         // mask for the column we want to update, and then set that bit in each
         // row for which there is a corresponding "on" bit in the input value.
         const auto outputColumnBit = (0x8000 >> (_sixelColumn + _textOffset));
@@ -397,7 +397,7 @@ std::tuple<VTInt, VTInt, VTInt> FontBuffer::_calculateDimensions() const
     }
 
     // Now we're going to test whether the dimensions are in range for a number
-    // of known terminals. We use the declared dimensions if given, otherwise
+    // of known terminals. We use the declared dimensions if given; otherwise,
     // estimate the size from the used sixel values. If comparing a sixel-based
     // height, though, we need to round up the target cell height to account for
     // the fact that our used height will always be a multiple of six.
diff --git a/src/terminal/adapter/MacroBuffer.hpp b/src/terminal/adapter/MacroBuffer.hpp
index 92c1c07c73f..86e5dfed889 100644
--- a/src/terminal/adapter/MacroBuffer.hpp
+++ b/src/terminal/adapter/MacroBuffer.hpp
@@ -30,7 +30,7 @@ namespace Microsoft::Console::VirtualTerminal
     public:
         // The original DEC terminals only supported 6K of memory, which is
         // probably a bit low for modern usage. But we also don't want to make
-        // this value too large, otherwise it could be used in a denial-of-
+        // this value too large; otherwise, it could be used in a denial-of-
         // service attack. So for now this is probably a sufficient limit, but
         // we may need to increase it in the future if we intend to support
         // macros containing sixel sequences.
diff --git a/src/terminal/adapter/adaptDispatch.cpp b/src/terminal/adapter/adaptDispatch.cpp
index cb8e4feb5a4..23e12f979f0 100644
--- a/src/terminal/adapter/adaptDispatch.cpp
+++ b/src/terminal/adapter/adaptDispatch.cpp
@@ -1009,7 +1009,7 @@ void AdaptDispatch::_ChangeRectOrStreamAttributes(const til::rect& changeArea, c
     // top line is altered from the left offset up to the end of the line. The
     // bottom line is altered from the start up to the right offset. All the
     // lines in-between have their entire length altered. The right coordinate
-    // must be greater than the left, otherwise the operation is ignored.
+    // must be greater than the left; otherwise, the operation is ignored.
     else if (lineCount > 1 && changeRect.right > changeRect.left)
     {
         const auto pageWidth = page.Width();
@@ -1322,7 +1322,7 @@ void AdaptDispatch::RequestChecksumRectangularArea(const VTInt id, const VTInt p
                 // As part of the checksum, we need to include the color indices of each
                 // cell, and in the case of default colors, those indices come from the
                 // color alias table. But if they're not in the bottom 16 range, we just
-                // fallback to using white on black (7 and 0).
+                // fall back to using white on black (7 and 0).
                 auto defaultFgIndex = _renderSettings.GetColorAliasIndex(ColorAlias::DefaultForeground);
                 auto defaultBgIndex = _renderSettings.GetColorAliasIndex(ColorAlias::DefaultBackground);
                 defaultFgIndex = defaultFgIndex < 16 ? defaultFgIndex : 7;
@@ -2392,7 +2392,9 @@ void AdaptDispatch::CarriageReturn()
 // Arguments:
 // - page - Target page on which the line feed is executed.
 // - withReturn - Set to true if a carriage return should be performed as well.
-// - wrapForced - Set to true is the line feed was the result of the line wrapping. if the viewport panned down. False if not.
+// - wrapForced - Set to true if the line feed was the result of the line wrapping.
+// Return Value:
+// - true if the viewport panned down; otherwise, false.
 bool AdaptDispatch::_DoLineFeed(const Page& page, const bool withReturn, const bool wrapForced)
 {
     auto& textBuffer = page.Buffer();
@@ -2468,7 +2470,7 @@ bool AdaptDispatch::_DoLineFeed(const Page& page, const bool withReturn, const b
         _api.NotifyBufferRotation(1);
 
         // We trigger a scroll rather than a redraw, since that's more efficient,
-        // but we need to turn the cursor off before doing so, otherwise a ghost
+        // but we need to turn the cursor off before doing so; otherwise, a ghost
         // cursor can be left behind in the previous position.
         cursor.SetIsOn(false);
         textBuffer.TriggerScroll({ 0, -1 });
@@ -2882,7 +2884,7 @@ void AdaptDispatch::AcceptC1Controls(const bool enabled)
 void AdaptDispatch::SendC1Controls(const bool enabled)
 {
     // If this is an attempt to enable C1 controls, the input code page must be
-    // one of the DOCS choices (UTF-8 or ISO-8859-1), otherwise there's a risk
+    // one of the DOCS choices (UTF-8 or ISO-8859-1); otherwise, there's a risk
     // that those controls won't have a valid encoding.
     const auto codepage = _api.GetInputCodePage();
     if (enabled == false || codepage == CP_UTF8 || codepage == 28591)
@@ -3354,7 +3356,7 @@ void AdaptDispatch::SetXtermColorResource(const size_t resource, const DWORD col
 // Method Description:
 // - Reports the value of one Xterm Color Resource, if it is set.
 // Return Value:
-// True if handled successfully. False otherwise.
+// - true if handled successfully; otherwise, false.
 void AdaptDispatch::RequestXtermColorResource(const size_t resource)
 {
     assert(resource >= 10);
@@ -4187,7 +4189,7 @@ ITermDispatch::StringHandler AdaptDispatch::RequestSetting()
         {
             // Although we don't yet support any operations with parameter
             // prefixes, it's important that we still parse the prefix and
-            // include it in the ID. Otherwise we'll mistakenly respond to
+            // include it in the ID. Otherwise, we'll mistakenly respond to
             // prefixed queries that we don't actually recognise.
             const auto isParameterPrefix = ch >= L'<' && ch <= L'?';
             const auto isParameter = ch >= L'0' && ch < L'9';
diff --git a/src/terminal/adapter/ut_adapter/inputTest.cpp b/src/terminal/adapter/ut_adapter/inputTest.cpp
index ab893be7724..d672004cd12 100644
--- a/src/terminal/adapter/ut_adapter/inputTest.cpp
+++ b/src/terminal/adapter/ut_adapter/inputTest.cpp
@@ -78,7 +78,7 @@ class Microsoft::Console::VirtualTerminal::InputTest
         irTest.Event.KeyEvent.bKeyDown = TRUE;
 
         // If we want to test a key with the Right Alt modifier, we must generate
-        // an event for the Alt key first, otherwise the modifier will be dropped.
+        // an event for the Alt key first; otherwise, the modifier will be dropped.
         if (WI_IsFlagSet(uiKeystate, RIGHT_ALT_PRESSED))
         {
             irTest.Event.KeyEvent.wVirtualKeyCode = VK_MENU;
diff --git a/src/terminal/input/mouseInput.cpp b/src/terminal/input/mouseInput.cpp
index c36ce160b4a..68ef6ed601b 100644
--- a/src/terminal/input/mouseInput.cpp
+++ b/src/terminal/input/mouseInput.cpp
@@ -269,7 +269,7 @@ static constexpr wchar_t _encodeDefaultCoordinate(const til::CoordType sCoordina
 // Parameters:
 // - <none>
 // Return value:
-// - true, if we are tracking mouse input. False, otherwise
+// - true, if we are tracking mouse input; otherwise, false.
 bool TerminalInput::IsTrackingMouseInput() const noexcept
 {
     return _inputMode.any(Mode::DefaultMouseTracking, Mode::ButtonEventMouseTracking, Mode::AnyEventMouseTracking);
diff --git a/src/terminal/input/terminalInput.cpp b/src/terminal/input/terminalInput.cpp
index ac0795bdc41..65dfa6f33c8 100644
--- a/src/terminal/input/terminalInput.cpp
+++ b/src/terminal/input/terminalInput.cpp
@@ -171,7 +171,7 @@ TerminalInput::OutputType TerminalInput::HandleKey(const INPUT_RECORD& event)
     if (matchingLastKeyPress && !_inputMode.test(Mode::AutoRepeat))
     {
         // Note that we must return an empty string here to imply that we've handled
-        // the event, otherwise the key press can still end up being submitted.
+        // the event; otherwise, the key press can still end up being submitted.
         return _makeNoOutput();
     }
     _lastVirtualKeyCode = virtualKeyCode;
diff --git a/src/terminal/parser/stateMachine.cpp b/src/terminal/parser/stateMachine.cpp
index 12954512bdb..c45e2fc2f43 100644
--- a/src/terminal/parser/stateMachine.cpp
+++ b/src/terminal/parser/stateMachine.cpp
@@ -1511,7 +1511,7 @@ void StateMachine::_EventOscString(const wchar_t wch)
 // - Handle the two-character termination of a OSC sequence.
 //   Events in this state will:
 //   1. Trigger the OSC action associated with the param on an OscTerminator
-//   2. Otherwise treat this as a normal escape character event.
+//   2. Otherwise, treat this as a normal escape character event.
 // Arguments:
 // - wch - Character that triggered the event
 // Return Value:
diff --git a/src/tools/U8U16Test/U8U16Test.cpp b/src/tools/U8U16Test/U8U16Test.cpp
index 89ed982453f..5c4d6a2f10f 100644
--- a/src/tools/U8U16Test/U8U16Test.cpp
+++ b/src/tools/U8U16Test/U8U16Test.cpp
@@ -57,7 +57,7 @@ u8state::u8state() noexcept :
                 {
                     // If the Lead Byte indicates that the last bytes in the string is a partial UTF-8 code point then cache them:
                     //  Use the bitmask at index `sequenceLen`. Compare the result with the operand having the same index. If they
-                    //  are not equal then the sequence has to be cached because it is a partial code point. Otherwise the
+                    //  are not equal then the sequence has to be cached because it is a partial code point. Otherwise, the
                     //  sequence is a complete UTF-8 code point and the whole string is ready for the conversion to hstring.
                     if ((*backIter & _cmpMasks.at(sequenceLen)) != _cmpOperands.at(sequenceLen))
                     {
diff --git a/src/types/UiaTextRangeBase.cpp b/src/types/UiaTextRangeBase.cpp
index 9b3d7040a5e..d91c57a08de 100644
--- a/src/types/UiaTextRangeBase.cpp
+++ b/src/types/UiaTextRangeBase.cpp
@@ -568,7 +568,7 @@ try
             // - the anchors have been populated
             // This means that we've found a contiguous range where the text attribute was found.
             // No point in searching through the rest of the search space.
-            // TLDR: keep updating the second anchor and make the range wider until the attribute changes.
+            // TL;DR: keep updating the second anchor and make the range wider until the attribute changes.
             break;
         }
     }
@@ -663,7 +663,7 @@ CATCH_RETURN();
 // - pRetVal - the attributeId's sub-type for the first cell in the range (i.e. foreground color)
 // - attr - the text attribute we're checking
 // Return Value:
-// - true, if the attributeId is supported. false, otherwise.
+// - true, if the attributeId is supported. Otherwise, false.
 // - pRetVal is populated with the appropriate response relevant to the returned bool.
 bool UiaTextRangeBase::_initializeAttrQuery(TEXTATTRIBUTEID attributeId, VARIANT* pRetVal, const TextAttribute& attr) const
 {
@@ -1310,7 +1310,7 @@ til::CoordType UiaTextRangeBase::_getViewportHeight(const til::inclusive_rect& v
 {
     assert(viewport.bottom >= viewport.top);
     // + 1 because til::inclusive_rect is inclusive on both sides so subtracting top
-    // and bottom gets rid of 1 more then it should.
+    // and bottom gets rid of 1 more, then it should.
     return viewport.bottom - viewport.top + 1;
 }
 
diff --git a/src/winconpty/winconpty.cpp b/src/winconpty/winconpty.cpp
index 79c97ddaa2e..144ea987a8c 100644
--- a/src/winconpty/winconpty.cpp
+++ b/src/winconpty/winconpty.cpp
@@ -417,7 +417,7 @@ static void _ClosePseudoConsole(_In_ PseudoConsole* pPty) noexcept
 //  INHERIT_CURSOR: This will cause the created conpty to attempt to inherit the
 //      cursor position of the parent terminal application. This can be useful
 //      for applications like `ssh`, where ssh (currently running in a terminal)
-//      might want to create a pseudoterminal session for an child application
+//      might want to create a pseudoterminal session for a child application
 //      and the child inherit the cursor position of ssh.
 //      The created conpty will immediately emit a "Device Status Request" VT
 //      sequence to hOutput, that should be replied to on hInput in the format
diff --git a/tools/GenerateAppxFromManifest.ps1 b/tools/GenerateAppxFromManifest.ps1
index 3bf0bba8268..a52c1cfc15d 100644
--- a/tools/GenerateAppxFromManifest.ps1
+++ b/tools/GenerateAppxFromManifest.ps1
@@ -21,7 +21,7 @@ param (
 [xml]$appxPrototypeData = Get-Content $AppxManifestPrototype
 
 # You need to make sure each element we add is part of the same namespace as the
-# Package, otherwise powershell will append a bunch of `xmlns=""` properties
+# Package; otherwise, powershell will append a bunch of `xmlns=""` properties
 # that will make the appx deployment reject the manifest.
 $rootNS = $appxPrototypeData.Package.NamespaceURI
 
@@ -38,7 +38,7 @@ $files | ForEach-Object {
     $InProcessServer = $appxPrototypeData.CreateNode("element", "InProcessServer", $rootNS)
     $Path = $appxPrototypeData.CreateNode("element", "Path", $rootNS)
 
-    # You need to stash the result here, otherwise a blank line will be echoed to
+    # You need to stash the result here; otherwise, a blank line will be echoed to
     # the console.
     $placeholder = $Path.InnerText = $_.name
 
diff --git a/tools/README.md b/tools/README.md
index 94e841a0b19..f69efb3a216 100644
--- a/tools/README.md
+++ b/tools/README.md
@@ -30,7 +30,7 @@ the `%DEFAULT_CONFIGURATION%` configuration, which is `Debug` if you use `razzle
 ## opencon (and openbash, openps)
 
 `opencon` can be used to launch the **last built** OpenConsole binary. If given an
-argument, it will try and run that program in the launched window. Otherwise it
+argument, it will try and run that program in the launched window. Otherwise, it
 will default to cmd.exe.
 
 `openbash` is similar, it immediately launches bash.exe (the Windows Subsystem