fix(docs-tests): stabilize landing-page and dist-rebuild assertions - #227
Draft
ottobolyos wants to merge 7 commits into
Draft
fix(docs-tests): stabilize landing-page and dist-rebuild assertions#227ottobolyos wants to merge 7 commits into
ottobolyos wants to merge 7 commits into
Conversation
ottobolyos
added a commit
to ottobolyos/mtconnect.net
that referenced
this pull request
Aug 17, 2026
ottobolyos
force-pushed
the
fix/docs-tests-baseline-failures
branch
from
August 19, 2026 12:12
144e4bf to
cb7a961
Compare
ottobolyos
added a commit
to ottobolyos/mtconnect.net
that referenced
this pull request
Aug 19, 2026
…-cascade 20260819T134500Z)
ottobolyos
added a commit
to ottobolyos/mtconnect.net
that referenced
this pull request
Aug 19, 2026
Convergent MEDIUM findings from the PR TrakHound#227 6-agent Ultrareview (F-SEC-001, F-SEC-002, F-IMP-001, F-CR-001) around the new RunVitepressBuild helper and MEDIUM/HIGH stale-doc-reference findings (F-DOC-001..006) around the producer/consumer mode shift. Deferred MEDIUM items (node preflight, dist-lock, bounded stdout, RunProcess helper, predicate/failure-path coverage) tracked in TrakHound#238 with concrete sketches so each lands as its own scoped PR. RunVitepressBuild fixture-side: * VitepressBuildTimeoutMs = 20 min bounds the child; on expiry the process tree is killed, drained partials captured, and an InvalidOperationException surfaces the diagnostic rather than a wall-clock CI timeout that discards it. * "using" on the Process handle guarantees OS handle + pipe release on every path (previously leaked on drain/wait/exit-code throws; warm CI runners accumulated handles across reruns). * XML doc <exception> block updated to enumerate the timeout arm alongside the pre-existing missing-entry and non-zero-exit arms. Stale doc sync (§1.0d-trigies-bis atomic bug-class): * tests/MTConnect.NET-Docs-Tests/RouteCheckTests.cs class summary, ServerReadyTimeoutMs summary, and OneTimeSetUp_Rebuilds_Dist remarks: replace "npm ci + npm run build" and the sentinel-only invariant with the new producer-always-rebuild + consumer-shard contract and the direct-vitepress-invocation rationale. * docs/development/docs-site.md: rewrite the end-to-end route-check section (lines 64, 72) to explain producer vs. consumer mode and why the fixture bypasses npm run build. * .github/workflows/dotnet.yml: expand the docs-prepare header comment to document the fixture's two-mode contract so the next maintainer editing the workflow does not re-encode the old sentinel-only invariant. Verification (bluefin, verify/pr227 worktree): * dotnet build MTConnect.NET.sln -p:IntegrationCoverage=true -> 0 warnings, 0 errors, 5s. * dotnet test tests/MTConnect.NET-Docs-Tests --no-build -> 72/72 passed, 57s. * dotnet test MTConnect.NET.sln --no-build -> 5,033/5,033 passed across every test project. * node --max-old-space-size=8192 node_modules/vitepress/bin/vitepress.js build -> build complete in 20.41s. Refs: TrakHound#238
ottobolyos
added a commit
to ottobolyos/mtconnect.net
that referenced
this pull request
Aug 19, 2026
…-cascade 20260819T174629Z)
ottobolyos
added a commit
to ottobolyos/mtconnect.net
that referenced
this pull request
Aug 19, 2026
ottobolyos
added a commit
to ottobolyos/mtconnect.net
that referenced
this pull request
Aug 19, 2026
ottobolyos
added a commit
to ottobolyos/mtconnect.net
that referenced
this pull request
Aug 19, 2026
Convergent MEDIUM findings from the PR TrakHound#227 6-agent Ultrareview (F-SEC-001, F-SEC-002, F-IMP-001, F-CR-001) around the new RunVitepressBuild helper and MEDIUM/HIGH stale-doc-reference findings (F-DOC-001..006) around the producer/consumer mode shift. Deferred MEDIUM items (node preflight, dist-lock, bounded stdout, RunProcess helper, predicate/failure-path coverage) tracked in TrakHound#238 with concrete sketches so each lands as its own scoped PR. RunVitepressBuild fixture-side: * VitepressBuildTimeoutMs = 20 min bounds the child; on expiry the process tree is killed, drained partials captured, and an InvalidOperationException surfaces the diagnostic rather than a wall-clock CI timeout that discards it. * "using" on the Process handle guarantees OS handle + pipe release on every path (previously leaked on drain/wait/exit-code throws; warm CI runners accumulated handles across reruns). * XML doc <exception> block updated to enumerate the timeout arm alongside the pre-existing missing-entry and non-zero-exit arms. Stale doc sync (§1.0d-trigies-bis atomic bug-class): * tests/MTConnect.NET-Docs-Tests/RouteCheckTests.cs class summary, ServerReadyTimeoutMs summary, and OneTimeSetUp_Rebuilds_Dist remarks: replace "npm ci + npm run build" and the sentinel-only invariant with the new producer-always-rebuild + consumer-shard contract and the direct-vitepress-invocation rationale. * docs/development/docs-site.md: rewrite the end-to-end route-check section (lines 64, 72) to explain producer vs. consumer mode and why the fixture bypasses npm run build. * .github/workflows/dotnet.yml: expand the docs-prepare header comment to document the fixture's two-mode contract so the next maintainer editing the workflow does not re-encode the old sentinel-only invariant. Verification (bluefin, verify/pr227 worktree): * dotnet build MTConnect.NET.sln -p:IntegrationCoverage=true -> 0 warnings, 0 errors, 5s. * dotnet test tests/MTConnect.NET-Docs-Tests --no-build -> 72/72 passed, 57s. * dotnet test MTConnect.NET.sln --no-build -> 5,033/5,033 passed across every test project. * node --max-old-space-size=8192 node_modules/vitepress/bin/vitepress.js build -> build complete in 20.41s. Refs: TrakHound#238
ottobolyos
force-pushed
the
fix/docs-tests-baseline-failures
branch
from
August 19, 2026 22:06
ab5367a to
ec9a385
Compare
ottobolyos
added a commit
to ottobolyos/mtconnect.net
that referenced
this pull request
Aug 19, 2026
ottobolyos
added a commit
to ottobolyos/mtconnect.net
that referenced
this pull request
Aug 21, 2026
Convergent MEDIUM findings from the PR TrakHound#227 6-agent Ultrareview (F-SEC-001, F-SEC-002, F-IMP-001, F-CR-001) around the new RunVitepressBuild helper and MEDIUM/HIGH stale-doc-reference findings (F-DOC-001..006) around the producer/consumer mode shift. Deferred MEDIUM items (node preflight, dist-lock, bounded stdout, RunProcess helper, predicate/failure-path coverage) tracked in TrakHound#238 with concrete sketches so each lands as its own scoped PR. RunVitepressBuild fixture-side: * VitepressBuildTimeoutMs = 20 min bounds the child; on expiry the process tree is killed, drained partials captured, and an InvalidOperationException surfaces the diagnostic rather than a wall-clock CI timeout that discards it. * "using" on the Process handle guarantees OS handle + pipe release on every path (previously leaked on drain/wait/exit-code throws; warm CI runners accumulated handles across reruns). * XML doc <exception> block updated to enumerate the timeout arm alongside the pre-existing missing-entry and non-zero-exit arms. Stale doc sync (§1.0d-trigies-bis atomic bug-class): * tests/MTConnect.NET-Docs-Tests/RouteCheckTests.cs class summary, ServerReadyTimeoutMs summary, and OneTimeSetUp_Rebuilds_Dist remarks: replace "npm ci + npm run build" and the sentinel-only invariant with the new producer-always-rebuild + consumer-shard contract and the direct-vitepress-invocation rationale. * docs/development/docs-site.md: rewrite the end-to-end route-check section (lines 64, 72) to explain producer vs. consumer mode and why the fixture bypasses npm run build. * .github/workflows/dotnet.yml: expand the docs-prepare header comment to document the fixture's two-mode contract so the next maintainer editing the workflow does not re-encode the old sentinel-only invariant. Verification (bluefin, verify/pr227 worktree): * dotnet build MTConnect.NET.sln -p:IntegrationCoverage=true -> 0 warnings, 0 errors, 5s. * dotnet test tests/MTConnect.NET-Docs-Tests --no-build -> 72/72 passed, 57s. * dotnet test MTConnect.NET.sln --no-build -> 5,033/5,033 passed across every test project. * node --max-old-space-size=8192 node_modules/vitepress/bin/vitepress.js build -> build complete in 20.41s. Refs: TrakHound#238
ottobolyos
force-pushed
the
fix/docs-tests-baseline-failures
branch
from
August 21, 2026 06:18
ec9a385 to
eab89cc
Compare
ottobolyos
added a commit
to ottobolyos/mtconnect.net
that referenced
this pull request
Aug 21, 2026
Convergent MEDIUM findings from the PR TrakHound#227 6-agent Ultrareview (F-SEC-001, F-SEC-002, F-IMP-001, F-CR-001) around the new RunVitepressBuild helper and MEDIUM/HIGH stale-doc-reference findings (F-DOC-001..006) around the producer/consumer mode shift. Deferred MEDIUM items (node preflight, dist-lock, bounded stdout, RunProcess helper, predicate/failure-path coverage) tracked in TrakHound#238 with concrete sketches so each lands as its own scoped PR. RunVitepressBuild fixture-side: * VitepressBuildTimeoutMs = 20 min bounds the child; on expiry the process tree is killed, drained partials captured, and an InvalidOperationException surfaces the diagnostic rather than a wall-clock CI timeout that discards it. * "using" on the Process handle guarantees OS handle + pipe release on every path (previously leaked on drain/wait/exit-code throws; warm CI runners accumulated handles across reruns). * XML doc <exception> block updated to enumerate the timeout arm alongside the pre-existing missing-entry and non-zero-exit arms. Stale doc sync (§1.0d-trigies-bis atomic bug-class): * tests/MTConnect.NET-Docs-Tests/RouteCheckTests.cs class summary, ServerReadyTimeoutMs summary, and OneTimeSetUp_Rebuilds_Dist remarks: replace "npm ci + npm run build" and the sentinel-only invariant with the new producer-always-rebuild + consumer-shard contract and the direct-vitepress-invocation rationale. * docs/development/docs-site.md: rewrite the end-to-end route-check section (lines 64, 72) to explain producer vs. consumer mode and why the fixture bypasses npm run build. * .github/workflows/dotnet.yml: expand the docs-prepare header comment to document the fixture's two-mode contract so the next maintainer editing the workflow does not re-encode the old sentinel-only invariant. Verification (bluefin, verify/pr227 worktree): * dotnet build MTConnect.NET.sln -p:IntegrationCoverage=true -> 0 warnings, 0 errors, 5s. * dotnet test tests/MTConnect.NET-Docs-Tests --no-build -> 72/72 passed, 57s. * dotnet test MTConnect.NET.sln --no-build -> 5,033/5,033 passed across every test project. * node --max-old-space-size=8192 node_modules/vitepress/bin/vitepress.js build -> build complete in 20.41s. Refs: TrakHound#238
ottobolyos
force-pushed
the
fix/docs-tests-baseline-failures
branch
from
August 21, 2026 08:34
eab89cc to
504a7a5
Compare
ottobolyos
added a commit
to ottobolyos/mtconnect.net
that referenced
this pull request
Aug 21, 2026
Convergent MEDIUM findings from the PR TrakHound#227 6-agent Ultrareview (F-SEC-001, F-SEC-002, F-IMP-001, F-CR-001) around the new RunVitepressBuild helper and MEDIUM/HIGH stale-doc-reference findings (F-DOC-001..006) around the producer/consumer mode shift. Deferred MEDIUM items (node preflight, dist-lock, bounded stdout, RunProcess helper, predicate/failure-path coverage) tracked in TrakHound#238 with concrete sketches so each lands as its own scoped PR. RunVitepressBuild fixture-side: * VitepressBuildTimeoutMs = 20 min bounds the child; on expiry the process tree is killed, drained partials captured, and an InvalidOperationException surfaces the diagnostic rather than a wall-clock CI timeout that discards it. * "using" on the Process handle guarantees OS handle + pipe release on every path (previously leaked on drain/wait/exit-code throws; warm CI runners accumulated handles across reruns). * XML doc <exception> block updated to enumerate the timeout arm alongside the pre-existing missing-entry and non-zero-exit arms. Stale doc sync (atomic bug-class fix): * tests/MTConnect.NET-Docs-Tests/RouteCheckTests.cs class summary, ServerReadyTimeoutMs summary, and OneTimeSetUp_Rebuilds_Dist remarks: replace "npm ci + npm run build" and the sentinel-only invariant with the new producer-always-rebuild + consumer-shard contract and the direct-vitepress-invocation rationale. * docs/development/docs-site.md: rewrite the end-to-end route-check section (lines 64, 72) to explain producer vs. consumer mode and why the fixture bypasses npm run build. * .github/workflows/dotnet.yml: expand the docs-prepare header comment to document the fixture's two-mode contract so the next maintainer editing the workflow does not re-encode the old sentinel-only invariant. Verification (bluefin, verify/pr227 worktree): * dotnet build MTConnect.NET.sln -p:IntegrationCoverage=true -> 0 warnings, 0 errors, 5s. * dotnet test tests/MTConnect.NET-Docs-Tests --no-build -> 72/72 passed, 57s. * dotnet test MTConnect.NET.sln --no-build -> 5,033/5,033 passed across every test project. * node --max-old-space-size=8192 node_modules/vitepress/bin/vitepress.js build -> build complete in 20.41s. Refs: TrakHound#238
ottobolyos
force-pushed
the
fix/docs-tests-baseline-failures
branch
from
August 21, 2026 14:13
504a7a5 to
30a9b5f
Compare
ottobolyos
added a commit
to ottobolyos/mtconnect.net
that referenced
this pull request
Aug 21, 2026
ottobolyos
added a commit
to ottobolyos/mtconnect.net
that referenced
this pull request
Aug 21, 2026
Convergent MEDIUM findings from the PR TrakHound#227 6-agent Ultrareview (F-SEC-001, F-SEC-002, F-IMP-001, F-CR-001) around the new RunVitepressBuild helper and MEDIUM/HIGH stale-doc-reference findings (F-DOC-001..006) around the producer/consumer mode shift. Deferred MEDIUM items (node preflight, dist-lock, bounded stdout, RunProcess helper, predicate/failure-path coverage) tracked in TrakHound#238 with concrete sketches so each lands as its own scoped PR. RunVitepressBuild fixture-side: * VitepressBuildTimeoutMs = 20 min bounds the child; on expiry the process tree is killed, drained partials captured, and an InvalidOperationException surfaces the diagnostic rather than a wall-clock CI timeout that discards it. * "using" on the Process handle guarantees OS handle + pipe release on every path (previously leaked on drain/wait/exit-code throws; warm CI runners accumulated handles across reruns). * XML doc <exception> block updated to enumerate the timeout arm alongside the pre-existing missing-entry and non-zero-exit arms. Stale doc sync (atomic bug-class fix): * tests/MTConnect.NET-Docs-Tests/RouteCheckTests.cs class summary, ServerReadyTimeoutMs summary, and OneTimeSetUp_Rebuilds_Dist remarks: replace "npm ci + npm run build" and the sentinel-only invariant with the new producer-always-rebuild + consumer-shard contract and the direct-vitepress-invocation rationale. * docs/development/docs-site.md: rewrite the end-to-end route-check section (lines 64, 72) to explain producer vs. consumer mode and why the fixture bypasses npm run build. * .github/workflows/dotnet.yml: expand the docs-prepare header comment to document the fixture's two-mode contract so the next maintainer editing the workflow does not re-encode the old sentinel-only invariant. Verification (bluefin, verify/pr227 worktree): * dotnet build MTConnect.NET.sln -p:IntegrationCoverage=true -> 0 warnings, 0 errors, 5s. * dotnet test tests/MTConnect.NET-Docs-Tests --no-build -> 72/72 passed, 57s. * dotnet test MTConnect.NET.sln --no-build -> 5,033/5,033 passed across every test project. * node --max-old-space-size=8192 node_modules/vitepress/bin/vitepress.js build -> build complete in 20.41s. Refs: TrakHound#238
ottobolyos
force-pushed
the
fix/docs-tests-baseline-failures
branch
from
August 21, 2026 16:05
30a9b5f to
93df4ba
Compare
ottobolyos
added a commit
to ottobolyos/mtconnect.net
that referenced
this pull request
Aug 21, 2026
…ion/up-to-pr-227
ottobolyos
added a commit
to ottobolyos/mtconnect.net
that referenced
this pull request
Aug 21, 2026
…ion/up-to-pr-227
ottobolyos
added a commit
to ottobolyos/mtconnect.net
that referenced
this pull request
Aug 22, 2026
Convergent MEDIUM findings from the PR TrakHound#227 6-agent Ultrareview (F-SEC-001, F-SEC-002, F-IMP-001, F-CR-001) around the new RunVitepressBuild helper and MEDIUM/HIGH stale-doc-reference findings (F-DOC-001..006) around the producer/consumer mode shift. Deferred MEDIUM items (node preflight, dist-lock, bounded stdout, RunProcess helper, predicate/failure-path coverage) tracked in TrakHound#238 with concrete sketches so each lands as its own scoped PR. RunVitepressBuild fixture-side: * VitepressBuildTimeoutMs = 20 min bounds the child; on expiry the process tree is killed, drained partials captured, and an InvalidOperationException surfaces the diagnostic rather than a wall-clock CI timeout that discards it. * "using" on the Process handle guarantees OS handle + pipe release on every path (previously leaked on drain/wait/exit-code throws; warm CI runners accumulated handles across reruns). * XML doc <exception> block updated to enumerate the timeout arm alongside the pre-existing missing-entry and non-zero-exit arms. Stale doc sync (atomic bug-class fix): * tests/MTConnect.NET-Docs-Tests/RouteCheckTests.cs class summary, ServerReadyTimeoutMs summary, and OneTimeSetUp_Rebuilds_Dist remarks: replace "npm ci + npm run build" and the sentinel-only invariant with the new producer-always-rebuild + consumer-shard contract and the direct-vitepress-invocation rationale. * docs/development/docs-site.md: rewrite the end-to-end route-check section (lines 64, 72) to explain producer vs. consumer mode and why the fixture bypasses npm run build. * .github/workflows/dotnet.yml: expand the docs-prepare header comment to document the fixture's two-mode contract so the next maintainer editing the workflow does not re-encode the old sentinel-only invariant. Verification (bluefin, verify/pr227 worktree): * dotnet build MTConnect.NET.sln -p:IntegrationCoverage=true -> 0 warnings, 0 errors, 5s. * dotnet test tests/MTConnect.NET-Docs-Tests --no-build -> 72/72 passed, 57s. * dotnet test MTConnect.NET.sln --no-build -> 5,033/5,033 passed across every test project. * node --max-old-space-size=8192 node_modules/vitepress/bin/vitepress.js build -> build complete in 20.41s. Refs: TrakHound#238
ottobolyos
force-pushed
the
fix/docs-tests-baseline-failures
branch
from
August 22, 2026 00:52
93df4ba to
f123d1b
Compare
ottobolyos
added a commit
to ottobolyos/mtconnect.net
that referenced
this pull request
Aug 23, 2026
Convergent MEDIUM findings from the PR TrakHound#227 6-agent Ultrareview (F-SEC-001, F-SEC-002, F-IMP-001, F-CR-001) around the new RunVitepressBuild helper and MEDIUM/HIGH stale-doc-reference findings (F-DOC-001..006) around the producer/consumer mode shift. Deferred MEDIUM items (node preflight, dist-lock, bounded stdout, RunProcess helper, predicate/failure-path coverage) tracked in TrakHound#238 with concrete sketches so each lands as its own scoped PR. RunVitepressBuild fixture-side: * VitepressBuildTimeoutMs = 20 min bounds the child; on expiry the process tree is killed, drained partials captured, and an InvalidOperationException surfaces the diagnostic rather than a wall-clock CI timeout that discards it. * "using" on the Process handle guarantees OS handle + pipe release on every path (previously leaked on drain/wait/exit-code throws; warm CI runners accumulated handles across reruns). * XML doc <exception> block updated to enumerate the timeout arm alongside the pre-existing missing-entry and non-zero-exit arms. Stale doc sync (atomic bug-class fix): * tests/MTConnect.NET-Docs-Tests/RouteCheckTests.cs class summary, ServerReadyTimeoutMs summary, and OneTimeSetUp_Rebuilds_Dist remarks: replace "npm ci + npm run build" and the sentinel-only invariant with the new producer-always-rebuild + consumer-shard contract and the direct-vitepress-invocation rationale. * docs/development/docs-site.md: rewrite the end-to-end route-check section (lines 64, 72) to explain producer vs. consumer mode and why the fixture bypasses npm run build. * .github/workflows/dotnet.yml: expand the docs-prepare header comment to document the fixture's two-mode contract so the next maintainer editing the workflow does not re-encode the old sentinel-only invariant. Verification (bluefin, verify/pr227 worktree): * dotnet build MTConnect.NET.sln -p:IntegrationCoverage=true -> 0 warnings, 0 errors, 5s. * dotnet test tests/MTConnect.NET-Docs-Tests --no-build -> 72/72 passed, 57s. * dotnet test MTConnect.NET.sln --no-build -> 5,033/5,033 passed across every test project. * node --max-old-space-size=8192 node_modules/vitepress/bin/vitepress.js build -> build complete in 20.41s. Refs: TrakHound#238
ottobolyos
force-pushed
the
fix/docs-tests-baseline-failures
branch
from
August 23, 2026 02:59
f123d1b to
3911623
Compare
ottobolyos
added a commit
to ottobolyos/mtconnect.net
that referenced
this pull request
Aug 23, 2026
…into integration/up-to-pr-227
ottobolyos
added a commit
to ottobolyos/mtconnect.net
that referenced
this pull request
Aug 25, 2026
…into integration/up-to-pr-227
ottobolyos
added a commit
to ottobolyos/mtconnect.net
that referenced
this pull request
Aug 25, 2026
…into integration/up-to-pr-227
ottobolyos
added a commit
to ottobolyos/mtconnect.net
that referenced
this pull request
Aug 25, 2026
…into integration/up-to-pr-228
ottobolyos
added a commit
to ottobolyos/mtconnect.net
that referenced
this pull request
Aug 25, 2026
ottobolyos
added a commit
to ottobolyos/mtconnect.net
that referenced
this pull request
Aug 25, 2026
ottobolyos
marked this pull request as ready for review
August 25, 2026 07:16
ottobolyos
added a commit
to ottobolyos/mtconnect.net
that referenced
this pull request
Aug 25, 2026
…into up-to-pr-223
ottobolyos
marked this pull request as draft
August 25, 2026 12:06
ottobolyos
marked this pull request as ready for review
August 25, 2026 12:10
ottobolyos
marked this pull request as draft
August 25, 2026 21:41
ottobolyos
added a commit
to ottobolyos/mtconnect.net
that referenced
this pull request
Aug 26, 2026
Convergent MEDIUM findings from the PR TrakHound#227 6-agent Ultrareview (F-SEC-001, F-SEC-002, F-IMP-001, F-CR-001) around the new RunVitepressBuild helper and MEDIUM/HIGH stale-doc-reference findings (F-DOC-001..006) around the producer/consumer mode shift. Deferred MEDIUM items (node preflight, dist-lock, bounded stdout, RunProcess helper, predicate/failure-path coverage) tracked in TrakHound#238 with concrete sketches so each lands as its own scoped PR. RunVitepressBuild fixture-side: * VitepressBuildTimeoutMs = 20 min bounds the child; on expiry the process tree is killed, drained partials captured, and an InvalidOperationException surfaces the diagnostic rather than a wall-clock CI timeout that discards it. * "using" on the Process handle guarantees OS handle + pipe release on every path (previously leaked on drain/wait/exit-code throws; warm CI runners accumulated handles across reruns). * XML doc <exception> block updated to enumerate the timeout arm alongside the pre-existing missing-entry and non-zero-exit arms. Stale doc sync (atomic bug-class fix): * tests/MTConnect.NET-Docs-Tests/RouteCheckTests.cs class summary, ServerReadyTimeoutMs summary, and OneTimeSetUp_Rebuilds_Dist remarks: replace "npm ci + npm run build" and the sentinel-only invariant with the new producer-always-rebuild + consumer-shard contract and the direct-vitepress-invocation rationale. * docs/development/docs-site.md: rewrite the end-to-end route-check section (lines 64, 72) to explain producer vs. consumer mode and why the fixture bypasses npm run build. * .github/workflows/dotnet.yml: expand the docs-prepare header comment to document the fixture's two-mode contract so the next maintainer editing the workflow does not re-encode the old sentinel-only invariant. Verification (bluefin, verify/pr227 worktree): * dotnet build MTConnect.NET.sln -p:IntegrationCoverage=true -> 0 warnings, 0 errors, 5s. * dotnet test tests/MTConnect.NET-Docs-Tests --no-build -> 72/72 passed, 57s. * dotnet test MTConnect.NET.sln --no-build -> 5,033/5,033 passed across every test project. * node --max-old-space-size=8192 node_modules/vitepress/bin/vitepress.js build -> build complete in 20.41s. Refs: TrakHound#238
ottobolyos
force-pushed
the
fix/docs-tests-baseline-failures
branch
from
August 26, 2026 04:28
2933bca to
8b94ab0
Compare
ottobolyos
added a commit
to ottobolyos/mtconnect.net
that referenced
this pull request
Aug 26, 2026
…ation/up-to-pr-227 Cascade rebuild after upstream/master advanced to 0ddc3c6 (PR TrakHound#220 merge).
ottobolyos
added a commit
to ottobolyos/mtconnect.net
that referenced
this pull request
Aug 26, 2026
Convergent MEDIUM findings from the PR TrakHound#227 6-agent Ultrareview (F-SEC-001, F-SEC-002, F-IMP-001, F-CR-001) around the new RunVitepressBuild helper and MEDIUM/HIGH stale-doc-reference findings (F-DOC-001..006) around the producer/consumer mode shift. Deferred MEDIUM items (node preflight, dist-lock, bounded stdout, RunProcess helper, predicate/failure-path coverage) tracked in TrakHound#238 with concrete sketches so each lands as its own scoped PR. RunVitepressBuild fixture-side: * VitepressBuildTimeoutMs = 20 min bounds the child; on expiry the process tree is killed, drained partials captured, and an InvalidOperationException surfaces the diagnostic rather than a wall-clock CI timeout that discards it. * "using" on the Process handle guarantees OS handle + pipe release on every path (previously leaked on drain/wait/exit-code throws; warm CI runners accumulated handles across reruns). * XML doc <exception> block updated to enumerate the timeout arm alongside the pre-existing missing-entry and non-zero-exit arms. Stale doc sync (atomic bug-class fix): * tests/MTConnect.NET-Docs-Tests/RouteCheckTests.cs class summary, ServerReadyTimeoutMs summary, and OneTimeSetUp_Rebuilds_Dist remarks: replace "npm ci + npm run build" and the sentinel-only invariant with the new producer-always-rebuild + consumer-shard contract and the direct-vitepress-invocation rationale. * docs/development/docs-site.md: rewrite the end-to-end route-check section (lines 64, 72) to explain producer vs. consumer mode and why the fixture bypasses npm run build. * .github/workflows/dotnet.yml: expand the docs-prepare header comment to document the fixture's two-mode contract so the next maintainer editing the workflow does not re-encode the old sentinel-only invariant. Verification (bluefin, verify/pr227 worktree): * dotnet build MTConnect.NET.sln -p:IntegrationCoverage=true -> 0 warnings, 0 errors, 5s. * dotnet test tests/MTConnect.NET-Docs-Tests --no-build -> 72/72 passed, 57s. * dotnet test MTConnect.NET.sln --no-build -> 5,033/5,033 passed across every test project. * node --max-old-space-size=8192 node_modules/vitepress/bin/vitepress.js build -> build complete in 20.41s. Refs: TrakHound#238
ottobolyos
force-pushed
the
fix/docs-tests-baseline-failures
branch
from
August 26, 2026 16:23
8b94ab0 to
7d9482d
Compare
ottobolyos
added a commit
to ottobolyos/mtconnect.net
that referenced
this pull request
Aug 26, 2026
…ation/up-to-pr-227 on top of integration/up-to-pr-226
ottobolyos
added a commit
to ottobolyos/mtconnect.net
that referenced
this pull request
Aug 26, 2026
…ation/up-to-pr-227 on top of previous cascade tip
… source The RouteCheckTests fixture previously honored a pre-existing docs/.vitepress/dist/index.html as evidence that dist was current. That was safe under the sharded CI matrix (ROUTE_SHARD_TOTAL > 1), where the docs-prepare job is the docfx-owning producer and each shard downloads its artefact — but not in producer mode. A warm local checkout keeps a stale dist across sessions, and the fixture would silently walk it: the landing-page test asserted against the old rendered HTML (missing the https:// og:image URL that landed in a later config.ts revision), and the producer-mode mtime invariant fired because no rebuild took place. Split the two modes explicitly: consumer shards keep the artefact contract (skip rebuild when index.html is present); producer mode always rebuilds via npm run build. This walks the current source on every run, satisfies the mtime invariant unconditionally in producer mode, and preserves the sharded artefact flow. Claude-Session: https://claude.ai/code/session_0162RfaA55VT8NX6QfU7RUVo
…uched Amends the earlier producer-mode-always-rebuilds fix so the fixture no longer routes through npm run build. The `prebuild` hook wired into docs/package.json runs docs/scripts/generate-api-ref.sh, which `dotnet build -c Debug --no-incremental`s every library, agent, adapter and module project. That sweep clobbers each project's obj/project.assets.json down to a Debug-only net8.0 view and races any in-flight multi-TFM Release build under `dotnet test MTConnect.NET.sln -c Release`, tripping NETSDK1005 on every non-net8.0 target MSBuild has not yet linked (net47, net461, net472, net9.0, net10.0, …). Invoke node node_modules/vitepress/bin/vitepress.js build directly under docs/ instead. Walks the same source markdown, produces the same dist/, keeps the producer-mode rebuild guarantee, and leaves the obj/ tree untouched. The docs/api/ sub-tree stays as whatever the last regen produced — the fixture never owned that regen (the docs-prepare workflow and generate-api-ref.sh do). Claude-Session: https://claude.ai/code/session_0162RfaA55VT8NX6QfU7RUVo
Convergent MEDIUM findings from the PR TrakHound#227 6-agent Ultrareview (F-SEC-001, F-SEC-002, F-IMP-001, F-CR-001) around the new RunVitepressBuild helper and MEDIUM/HIGH stale-doc-reference findings (F-DOC-001..006) around the producer/consumer mode shift. Deferred MEDIUM items (node preflight, dist-lock, bounded stdout, RunProcess helper, predicate/failure-path coverage) tracked in TrakHound#238 with concrete sketches so each lands as its own scoped PR. RunVitepressBuild fixture-side: * VitepressBuildTimeoutMs = 20 min bounds the child; on expiry the process tree is killed, drained partials captured, and an InvalidOperationException surfaces the diagnostic rather than a wall-clock CI timeout that discards it. * "using" on the Process handle guarantees OS handle + pipe release on every path (previously leaked on drain/wait/exit-code throws; warm CI runners accumulated handles across reruns). * XML doc <exception> block updated to enumerate the timeout arm alongside the pre-existing missing-entry and non-zero-exit arms. Stale doc sync (atomic bug-class fix): * tests/MTConnect.NET-Docs-Tests/RouteCheckTests.cs class summary, ServerReadyTimeoutMs summary, and OneTimeSetUp_Rebuilds_Dist remarks: replace "npm ci + npm run build" and the sentinel-only invariant with the new producer-always-rebuild + consumer-shard contract and the direct-vitepress-invocation rationale. * docs/development/docs-site.md: rewrite the end-to-end route-check section (lines 64, 72) to explain producer vs. consumer mode and why the fixture bypasses npm run build. * .github/workflows/dotnet.yml: expand the docs-prepare header comment to document the fixture's two-mode contract so the next maintainer editing the workflow does not re-encode the old sentinel-only invariant. Verification (bluefin, verify/pr227 worktree): * dotnet build MTConnect.NET.sln -p:IntegrationCoverage=true -> 0 warnings, 0 errors, 5s. * dotnet test tests/MTConnect.NET-Docs-Tests --no-build -> 72/72 passed, 57s. * dotnet test MTConnect.NET.sln --no-build -> 5,033/5,033 passed across every test project. * node --max-old-space-size=8192 node_modules/vitepress/bin/vitepress.js build -> build complete in 20.41s. Refs: TrakHound#238
…iagnostics Ultrareview cycle-1 convergent finding (code-review F-CR-001, simplification F-SIMP-001, improvement F-IMP-001): RunNpm leaked its Process handle and had no timeout bound, the exact defect class this PR's own fix commit resolved in RunVitepressBuild. Extract both into a shared RunProcess helper so `npm ci` gets the same dispose-on-every-path + bounded-wait-with-kill hardening. Also: sanitize control characters out of captured child-process output before it lands in exception messages (security-audit F-SEC-001, LOW); correct the ServerReadyTimeoutMs doc comment, which claimed the 60 s bind deadline covers npm/build time that has, in fact, already completed by the time the preview server starts (code-review F-CR-002); cross-reference the shared prebuild-hook obj/ race from EnvironmentVariables_Page_Is_In_Sync_With_Source back to RunVitepressBuild's remarks (improvement F-IMP-002). 72/72 MTConnect.NET-Docs-Tests pass; build 0/0; format clean.
Bluefin's full-solution `dotnet test MTConnect.NET.sln` run on integration/up-to-pr-227 surfaced EnvironmentVariables_Page_Is_In_Sync_With_Source as flaky (fails at solution scope, passes when the Docs-Tests project runs alone). Root cause: EnvVarInventory.Collect walks repoRoot recursively for *.cs files and only excludes bin/obj/node_modules/.git/ .vitepress by directory name — it does not exclude .claude/worktrees/, the repo's convention for nested agent-session git worktrees. On a host with sibling worktrees checked out under .claude/worktrees/ (as bluefin had at test time), the scan picks up GetEnvironmentVariable call sites from whatever branch each nested worktree happens to have checked out, producing a false "out of sync" verdict unrelated to the current branch's actual source tree. Excludes .claude the same way bin/obj/.git already are. Verified locally (72/72 Docs-Tests pass, this worktree has no nested .claude pollution so this is a defensive/root-cause fix pending bluefin re-verification against the actual polluted host state).
…ve CS0518
The docs-prepare CI job and local `bash docs/scripts/generate-api-ref.sh`
runs failed with 120 CS0518 errors (`Predefined type 'System.Object' /
'System.String' / 'System.Void' is not defined or imported`) plus 3,943
`InvalidAssemblyReference` warnings when docfx metadata loaded the 43
pre-built Debug/net8.0 DLLs listed in `docs/.docfx/docfx.json`
`metadata[].src.files`. Root cause: docfx's DLL-loader path cannot
resolve corelib references (System.Runtime / mscorlib) because the DLL
tree carries no matching reference assemblies alongside; docfx then
falls back to synthesising a stub compilation that has no `System.*`
imports, which trips CS0518 on every emitted AssemblyInfo.cs.
Fix — switch the metadata source from DLLs to `.csproj` project files
so docfx uses MSBuild workspace loading. MSBuild resolves references
via the project's `<TargetFramework>` and the .NET SDK's reference-
assembly packs, exactly as `dotnet build` does. This is the intended
docfx analysis path for library documentation; the DLL path is only
meant for third-party assemblies without source.
Composite of the two sub-fixes both required for a Linux-CI-runnable
metadata run:
1. Metadata src `files:` now lists the 43 `.csproj` paths that
mirror the previous DLL list one-for-one (including the
`templates/mtconnect.net-agent/content/MTConnect.NET-Embedded-
Agent/Agent.csproj` naming override).
2. `metadata[].properties`: `{ TargetFramework: "net8.0",
Configuration: "Debug" }` pins the msbuild workspace to the
single modern TFM. Without this, multi-TFM projects (all
libraries + agent + adapter + examples target
net461/462/47/47.1/47.2/48/8.0/9.0) trigger a per-TFM msbuild
load attempt; the .NET Framework 4.x TFMs then fail on Linux
with "reference assemblies for .NETFramework,Version=v4.6.1
were not found" because the developer packs are Windows-only.
Pinning to net8.0 keeps the CI docs-prepare job (which installs
only 8.0.x + 9.0.x SDKs) buildable and mirrors the analysis
target the docfx metadata run was always intended for.
Verified on bluefin against `docfx 2.78.5` + `.NET 10.0.302`:
`bash docs/scripts/generate-api-ref.sh` now completes cleanly with 0
errors, 2 pre-existing DeviceFinder XML-doc warnings (unchanged), and
2,242 markdown pages generated. Fix is master-side pre-existing bug —
not scoped originally to this PR, but the docs-prepare CI job was also
red on this branch's own head and every downstream cascade branch, so
folding the fix in here unblocks the whole train.
ottobolyos
force-pushed
the
fix/docs-tests-baseline-failures
branch
from
August 27, 2026 02:49
d4533c7 to
3ad6862
Compare
Per §1.0d-trigies-vicies-octies (AmE mandatory across every PR-associated surface), three PR-introduced BrE tokens are converted: - docs/development/docs-site.md: 'honours' -> 'honors' in the dist sentinel note - tests/MTConnect.NET-Docs-Tests/DocsReferenceGenerationTests.cs L67: 'behaviour' -> 'behavior' in test docstring - tests/MTConnect.NET-Docs-Tests/RouteCheckTests.cs L160: 'Honouring' -> 'Honoring' in policy comment Comment / docstring / prose only; no behavior change.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Two intermittent failures in
tests/MTConnect.NET-Docs-Tests/RouteCheckTests.csonupstream/master—Landing_Page_Carries_The_House_Style_SurfacesandOneTimeSetUp_Rebuilds_Dist_When_Fixture_Is_Producer— share a single root cause: the fixture'sOneTimeSetUphonored a pre-existingdocs/.vitepress/dist/index.htmlas evidence that dist was current, so a warm-cache local run silently walked whatever tree survived from the previous session. Producer mode now always rebuilds; consumer shards keep the artifact contract.Also folds in a fix for the master-side
docs-prepareCI job (and localbash docs/scripts/generate-api-ref.sh), which failed with 120 CS0518 errors plus 3,943InvalidAssemblyReferencewarnings when docfx metadata loaded the 43 pre-built Debug/net8.0 DLLs. The docs-prepare job was red on every branch's own head and every downstream cascade branch, blocking the whole train; folding the fix in here unblocks it.Root cause
Landing_Page_Carries_The_House_Style_SurfacesAsserted
og:imagestarts withhttps://but received/logo.png. The dist on the affected machine was built before commit8c2f0f9b(docs(config): derive absolute og:image URL from DOCS_CANONICAL_URL) landed on master, and the fixture skipped the rebuild becausedist/index.htmlexisted. The stale HTML carried the earlier root-relativeog:imagevalue; every subsequent run against that dist reproduced the failure until dist was regenerated by hand. The current source (docs/.vitepress/config.ts) generates the correcthttps://trakhound.github.io/MTConnect.NET/logo.pngURL; the failure was purely a stale-artifact effect.OneTimeSetUp_Rebuilds_Dist_When_Fixture_Is_ProducerAsserted
distMtime >= _fixtureStartTimebut observed a dist mtime several weeks older than the fixture start. Same producer-mode-warm-cache path: the fixture'sif (!File.Exists(distIndex))gate short-circuited, nonpm run buildran,dist/index.htmlkept its previous mtime, and the invariant fired. The test's own docstring frames it as a regression pin for the rebuild contract, but the fixture never actually held to that contract on a warm cache.docs-prepareCI job CS0518docs/.docfx/docfx.json'smetadata[].src.fileslisted 43 pre-built.dllartefacts. Docfx's DLL-loader path cannot resolve corelib references (System.Runtime / mscorlib) because the DLL tree carries no matching reference assemblies alongside; docfx then falls back to synthesising a stub compilation that has noSystem.*imports, which trips CS0518 (Predefined type 'System.Object' / 'System.String' / 'System.Void' is not defined or imported) on every emittedAssemblyInfo.cs. Reproducer on bareupstream/master @ dc7b100c:Build failed. 3943 warning(s) 120 error(s).Fix
Two coordinated changes, both in-scope of the docs-tests baseline:
RouteCheckTests.csproducer/consumer splitSplit the
OneTimeSetUpdist-build gate into producer vs. consumer mode, and invokevitepress builddirectly underdocs/in producer mode.ROUTE_SHARD_TOTAL <= 1) — always rebuilddist/before starting the preview server. The fixture is the sole authority ondist/under this mode, so a warm-cache local run still walks a tree generated from the current source markdown, currentconfig.ts, current sidebar, and so on. This is the behavior every test in the fixture assumed and none of them enforced.ROUTE_SHARD_TOTAL > 1) — keep the pre-existing behavior: consume thedist/tree thedocs-prepareCI job produced and skip the rebuild. The shard runners do not install docfx.The rebuild goes through a new
RunVitepressBuildhelper that spawnsnode --max-old-space-size=8192 node_modules/vitepress/bin/vitepress.js buildunderdocs/— bypassing thenpm run buildprebuildhook that would otherwise rundocs/scripts/generate-api-ref.sh. Theprebuildstep does adotnet build -c Debug --no-incrementalsweep of every library, agent, adapter, and module project; that sweep rewrites each project'sobj/project.assets.jsondown to a Debug-onlynet8.0view. Inside a fulldotnet test MTConnect.NET.sln -c Releaseinvocation the solution build's multi-TFM Release outputs (net47, net461, net472, net9.0, net10.0, …) are still in flight, and the clobber trips NETSDK1005 on every non-net8.0 target MSBuild has not yet linked. Invoking vitepress directly walks the same source markdown, produces the samedist/, keeps the producer-mode rebuild guarantee, and leaves theobj/tree untouched. Thedocs/api/sub-tree stays as whatever the last regen produced — this fixture does not own that regen (thedocs-prepareworkflow anddocs/scripts/generate-api-ref.shdo).The mtime invariant now holds unconditionally in producer mode (
dist/index.htmlis freshly written on everyOneTimeSetUp), and the landing-page assertions walk HTML generated from the currentconfig.ts. Sharded CI legs continue to consume the upstreamdocs-prepareartifact per the existing contract.docs/.docfx/docfx.jsonDLL → csproj rewriteSwitch the metadata source from DLLs to
.csprojproject files so docfx uses MSBuild workspace loading. MSBuild resolves references via the project's<TargetFramework>and the .NET SDK's reference-assembly packs, exactly asdotnet builddoes. This is the intended docfx analysis path for library documentation; the DLL path is only meant for third-party assemblies without source.Composite of the two sub-fixes both required for a Linux-CI-runnable metadata run:
src.filesnow lists the 43.csprojpaths that mirror the previous DLL list one-for-one (including thetemplates/mtconnect.net-agent/content/MTConnect.NET-Embedded-Agent/Agent.csprojnaming override).metadata[].properties:{ TargetFramework: "net8.0", Configuration: "Debug" }pins the msbuild workspace to the single modern TFM. Without this, multi-TFM projects (all libraries + agent + adapter + examples target net461/462/47/47.1/47.2/48/8.0/9.0) trigger a per-TFM msbuild load attempt; the .NET Framework 4.x TFMs then fail on Linux with "reference assemblies for .NETFramework,Version=v4.6.1 were not found" because the developer packs are Windows-only. Pinning to net8.0 keeps the CI docs-prepare job (which installs only 8.0.x + 9.0.x SDKs) buildable and mirrors the analysis target the docfx metadata run was always intended for.Verified on bluefin against
docfx 2.78.5+.NET 10.0.302:bash docs/scripts/generate-api-ref.shnow completes cleanly with 0 errors, 2 pre-existing DeviceFinder XML-doc warnings (unchanged), and 2,242 markdown pages generated.Dime review cycle 1
Retroactive backfill (2026-08-20). The 6-agent Ultrareview cycle ran on this PR (verified on bluefin
verify/pr227worktree; build 0 warn / 0 err; docs-tests focused 72/72 pass in 57s; full sweep 5,033/5,033 pass across every test project; vitepress build complete in 20.41s). Ledger reconstruction from commit history + tracking issue #238:[FINDING:A05]security-audit MEDIUM (F-SEC-001) — child-process spawn without a timeout risked hanging CI on a stuck vitepress build; closed atomically inharden(docs-tests): bound vitepress build + dispose Process + sync docs(ec9a385).[FINDING:A05]security-audit MEDIUM (F-SEC-002) — Process object not disposed after use; closed atomically in the same ec9a385 commit.[IMPROVE]improvement MEDIUM (F-IMP-001) — kill-on-timeout escape hatch required for stuck child processes; closed atomically in ec9a385.[FINDING]code-review MEDIUM (F-CR-001) — convergent finding on the child-process timeout + disposal pattern; closed atomically in ec9a385.[DOCS]documentation-audit HIGH (F-DOC-001..006) — stale doc references tonpm run buildand the sentinel-only invariant surfaced across three sites; synced atomically in the same ec9a385 commit acrossRouteCheckTests.csclass summary,docs/development/docs-site.mdroute-check section, and.github/workflows/dotnet.ymldocs-prepare header.[IMPROVE]improvement MEDIUM (F-IMP-002) — node preflight check fornode --max-old-space-sizesupport. TRACKED against docs-tests: fixture robustness + coverage follow-ups from PR #227 ultrareview #238 with concrete implementation sketch.[IMPROVE]improvement MEDIUM (F-IMP-003) — dist-lock to prevent concurrent producer-mode rebuilds. TRACKED against docs-tests: fixture robustness + coverage follow-ups from PR #227 ultrareview #238.[IMPROVE]improvement MEDIUM (F-IMP-004) — bounded stdout capture on vitepress build. TRACKED against docs-tests: fixture robustness + coverage follow-ups from PR #227 ultrareview #238.[SIMPLIFY]simplification (F-SIMP-001) —RunProcesshelper extraction for the vitepress spawn call site. TRACKED against docs-tests: fixture robustness + coverage follow-ups from PR #227 ultrareview #238.[TEST]test-coverage-audit (F-TEST-001..004) — predicate coverage + failure-path pins on the RunVitepressBuild helper. TRACKED against docs-tests: fixture robustness + coverage follow-ups from PR #227 ultrareview #238.(Zero unfixed findings — Ready-eligible.)
Depends on