From 6d65bdf39aabb8605ca278b84ff91d1453e7041e Mon Sep 17 00:00:00 2001
From: dv00d00 <1162823+dv00d00@users.noreply.github.com>
Date: Thu, 20 Aug 2026 22:01:23 +0100
Subject: [PATCH 1/2] Restore the supported default build
---
readme.md | 13 +-
.../AngleSharp.ReadOnlyDom.HackerNews.csproj | 8 +-
.../README.md | 15 +-
.../AngleSharp.ReadOnlyDom.Streaming.csproj | 8 +-
.../AngleSharp.ReadOnlyDom.Tests.csproj | 148 +-----------------
5 files changed, 27 insertions(+), 165 deletions(-)
diff --git a/readme.md b/readme.md
index 5a2ee68..d7ca3e4 100644
--- a/readme.md
+++ b/readme.md
@@ -59,7 +59,7 @@ serially because the solution and the fork share AngleSharp output paths:
```powershell
dotnet restore AngleSharp.ReadOnlyDom.slnx --force --no-cache
dotnet build AngleSharp.ReadOnlyDom.slnx -c Release --no-restore -m:1
-dotnet test tests/AngleSharp.ReadOnlyDom.Tests/AngleSharp.ReadOnlyDom.Tests.csproj -c Release -f net10.0 --no-restore
+dotnet test tests/AngleSharp.ReadOnlyDom.Tests/AngleSharp.ReadOnlyDom.Tests.csproj -c Release -f net10.0 --no-restore -- --minimum-expected-tests 1
```
The Release build output should contain an
@@ -345,13 +345,15 @@ dotnet run --project samples/AngleSharp.ReadOnlyDom.MarkdownProxy -c Release
```
The Hacker News reader folds a live list page into NDJSON one story at a time and unfurls a link-preview card per row
-on scroll, abandoning each linked page's download at ``. Targets `net11.0` with platform async, so it needs a
-.NET 11 SDK:
+on scroll, abandoning each linked page's download at ``. It builds on the default .NET 10 lane:
```powershell
dotnet run --project samples/AngleSharp.ReadOnlyDom.HackerNews -c Release
```
+With a .NET 11 SDK, pass `-p:Net11Lane=true -p:Net11Async=true` to opt the sample and streaming library into the
+platform-async experiment.
+
Opinionated text/Markdown projections and safe local Markdown navigation remain runnable examples rather than library
surface:
@@ -360,10 +362,11 @@ dotnet run --project samples/AngleSharp.ReadOnlyDom.ExtractionExamples -c Releas
dotnet run --project samples/AngleSharp.ReadOnlyDom.MarkdownNavigation -c Release
```
-Run the test suite from the repository root:
+Run the test suite from the repository root. The minimum count guard prevents a broken test-host configuration from
+reporting success after discovering no tests:
```powershell
-dotnet test AngleSharp.ReadOnlyDom.slnx -c Release
+dotnet test tests/AngleSharp.ReadOnlyDom.Tests/AngleSharp.ReadOnlyDom.Tests.csproj -c Release -f net10.0 -- --minimum-expected-tests 1
```
## Repository layout
diff --git a/samples/AngleSharp.ReadOnlyDom.HackerNews/AngleSharp.ReadOnlyDom.HackerNews.csproj b/samples/AngleSharp.ReadOnlyDom.HackerNews/AngleSharp.ReadOnlyDom.HackerNews.csproj
index 0ff38df..62eefdc 100644
--- a/samples/AngleSharp.ReadOnlyDom.HackerNews/AngleSharp.ReadOnlyDom.HackerNews.csproj
+++ b/samples/AngleSharp.ReadOnlyDom.HackerNews/AngleSharp.ReadOnlyDom.HackerNews.csproj
@@ -1,10 +1,12 @@
- net11.0
+ net10.0
+ net11.0
enable
enable
- preview
- $(Features);runtime-async=on
+ true
+ preview
+ $(Features);runtime-async=on
diff --git a/samples/AngleSharp.ReadOnlyDom.HackerNews/README.md b/samples/AngleSharp.ReadOnlyDom.HackerNews/README.md
index 74bcf96..4f7dc48 100644
--- a/samples/AngleSharp.ReadOnlyDom.HackerNews/README.md
+++ b/samples/AngleSharp.ReadOnlyDom.HackerNews/README.md
@@ -3,12 +3,13 @@
A Hacker News front end built on two streaming query plans. Nothing is buffered: list HTML is folded into NDJSON one
story per line, and each row unfurls a link-preview card as it scrolls into view.
-Needs a .NET 11 SDK (`net11.0`, platform async on).
+The default lane targets `net10.0`. A .NET 11 SDK can opt into the platform-async experiment without making the
+repository's normal build depend on a preview SDK.
```powershell
dotnet run --project samples/AngleSharp.ReadOnlyDom.HackerNews -c Release
-# with the library on the same async lane
+# Optional: target net11.0 and put both the app and library on the platform-async lane.
dotnet run --project samples/AngleSharp.ReadOnlyDom.HackerNews -c Release -p:Net11Lane=true -p:Net11Async=true
```
@@ -52,12 +53,10 @@ socket goes through a `ConnectCallback` that refuses private, loopback, link-loc
time, not parse time. Card images are re-served from this origin. Feeds cache 15 s, cards 10 min. Cards load three
at a time.
-**Platform async.** `Features=runtime-async=on` is the switch; `UseRuntimeAsync` alone is a no-op and SDK
-11.0.100-preview.7 has no property for it. Restore does not flow `AdditionalProperties` across a project reference,
-so `Net11Lane`/`Net11Async` must be global `-p:` properties or restore fails NETSDK1005. Emitted state machines: 0
-vs 3 for this app (43,008 B vs 52,224 B), 0 vs 14 for the library (293,376 B vs 309,760 B). Whether it is *faster*
-is unmeasured here — earlier preview-6 runs gained 1–4% on stream shapes while the preview JIT lost 8–12% on the
-synchronous tokenizer loop.
+**Platform async.** The checked-in default is the supported `net10.0` lane. Passing both `Net11Lane=true` and
+`Net11Async=true` targets `net11.0` and adds `Features=runtime-async=on`; the properties must be global `-p:` values so
+restore also applies them to the streaming project reference. The experiment previously emitted 0 compiler-generated
+state machines versus 3 for this app, and 0 versus 14 for the library. Whether it is *faster* remains unmeasured here.
**Limits.** Lexical start/end-tag topology, not corrected tree topology: omitted end tags and foster parenting can
differ from a DOM converter. A page that declares card metadata below the head, or only from script, gets no card.
diff --git a/src/AngleSharp.ReadOnlyDom.Streaming/AngleSharp.ReadOnlyDom.Streaming.csproj b/src/AngleSharp.ReadOnlyDom.Streaming/AngleSharp.ReadOnlyDom.Streaming.csproj
index c3f8e2d..e6a9375 100644
--- a/src/AngleSharp.ReadOnlyDom.Streaming/AngleSharp.ReadOnlyDom.Streaming.csproj
+++ b/src/AngleSharp.ReadOnlyDom.Streaming/AngleSharp.ReadOnlyDom.Streaming.csproj
@@ -2,16 +2,16 @@
net8.0;net10.0
net8.0;net10.0;net11.0
- true
- $(Features);runtime-async=on
- preview
+ true
+ $(Features);runtime-async=on
+ preview
enable
enable
false
-
+
diff --git a/tests/AngleSharp.ReadOnlyDom.Tests/AngleSharp.ReadOnlyDom.Tests.csproj b/tests/AngleSharp.ReadOnlyDom.Tests/AngleSharp.ReadOnlyDom.Tests.csproj
index 2b80da0..a51fc2e 100644
--- a/tests/AngleSharp.ReadOnlyDom.Tests/AngleSharp.ReadOnlyDom.Tests.csproj
+++ b/tests/AngleSharp.ReadOnlyDom.Tests/AngleSharp.ReadOnlyDom.Tests.csproj
@@ -1,4 +1,4 @@
-
+
Exe
net10.0;net472
@@ -28,149 +28,7 @@
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
- PreserveNewest
-
+
+
From fc05a2115f1e6827a98f97a32221867521703bab Mon Sep 17 00:00:00 2001
From: dv00d00 <1162823+dv00d00@users.noreply.github.com>
Date: Thu, 20 Aug 2026 22:01:23 +0100
Subject: [PATCH 2/2] Add handoff CI and upstream tracking
---
.github/workflows/build.yml | 47 +++++++++++++++++++++++++++++++
docs/UPSTREAM_ANGLESHARP_NOTES.md | 43 ++++++++++++++++++----------
2 files changed, 75 insertions(+), 15 deletions(-)
create mode 100644 .github/workflows/build.yml
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
new file mode 100644
index 0000000..9c64d0b
--- /dev/null
+++ b/.github/workflows/build.yml
@@ -0,0 +1,47 @@
+name: Build
+
+on:
+ push:
+ branches:
+ - main
+ pull_request:
+
+permissions:
+ contents: read
+
+jobs:
+ build-and-test:
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Check out ReadOnlyDom
+ uses: actions/checkout@v7.0.1
+ with:
+ path: AngleSharp.ReadOnlyDom
+
+ - name: Check out the matching AngleSharp source
+ uses: actions/checkout@v7.0.1
+ with:
+ repository: dv00d00/AngleSharp
+ ref: devel
+ path: AngleSharp
+
+ - name: Set up .NET
+ uses: actions/setup-dotnet@v6.0.0
+ with:
+ dotnet-version: 10.0.x
+
+ - name: Restore
+ run: dotnet restore AngleSharp.ReadOnlyDom.slnx --force --no-cache
+ working-directory: AngleSharp.ReadOnlyDom
+
+ - name: Build
+ run: dotnet build AngleSharp.ReadOnlyDom.slnx -c Release --no-restore -m:1
+ working-directory: AngleSharp.ReadOnlyDom
+
+ - name: Test
+ run: >-
+ dotnet test tests/AngleSharp.ReadOnlyDom.Tests/AngleSharp.ReadOnlyDom.Tests.csproj
+ -c Release -f net10.0 --no-build --no-restore --
+ --minimum-expected-tests 1 --progress off
+ working-directory: AngleSharp.ReadOnlyDom
diff --git a/docs/UPSTREAM_ANGLESHARP_NOTES.md b/docs/UPSTREAM_ANGLESHARP_NOTES.md
index 61b32f8..0c4dc32 100644
--- a/docs/UPSTREAM_ANGLESHARP_NOTES.md
+++ b/docs/UPSTREAM_ANGLESHARP_NOTES.md
@@ -1,4 +1,23 @@
-# AngleSharp generic construction notes
+# AngleSharp upstream dependencies
+
+The object and compact DOM projects exercise generic construction and byte-source APIs that are not in a released
+AngleSharp package yet. Until they ship, `Directory.Build.targets` replaces the AngleSharp package reference with a
+source checkout. The standalone streaming project does not use that override.
+
+## Upstream tracking
+
+Status snapshot: 2026-08-20. All three pull requests are open and mergeable; their Linux and Windows jobs compile the
+changes and then hit the same Fallout/.NET SDK infrastructure failure described in the PR comments.
+
+| Pull request | Relationship to this repository |
+| --- | --- |
+| [AngleSharp/AngleSharp#1285](https://github.com/AngleSharp/AngleSharp/pull/1285) | Handle-oriented HTML tree construction used by the compact arena |
+| [AngleSharp/AngleSharp#1286](https://github.com/AngleSharp/AngleSharp/pull/1286) | Direct `ReadOnlyMemory` parsing in the retained DOM lanes |
+| [AngleSharp/AngleSharp#1287](https://github.com/AngleSharp/AngleSharp/pull/1287) | Related opt-in custom-DOM whitespace contract; not enabled by default here |
+
+Do not publish the retained DOM packages against the temporary source contract. After #1285 and #1286 land in an
+AngleSharp release, remove the source override, update the central package version, and run the full multi-target suite
+against the package before making either project packable. #1287 can land independently.
## Handle-oriented tree construction
@@ -8,19 +27,13 @@ FsCheck differential testing against AngleSharp 1.5.2 reduced a mismatch to malf