Release 0.1.0-rc.3
Coordinated AppSurface release 0.1.0-rc.3, tagged on 2026-06-08.
Source of truth
This is the release note for AppSurface 0.1.0-rc.3 after 0.1.0-rc.2. This page is finalized on 2026-06-08.
What changed since RC 2
RC 3 turns the previous candidate into a broader evaluator release. The main changes are a public ASP.NET Core auth adapter, package-consumer coverage run/merge/gate commands, release evidence bundles, docs/runtime polish, and package validation updates that keep the package chooser pointed at one current release-candidate story.
Included in RC 3
Release and docs surface
- AppSurface Auth now includes
ForgeTrust.AppSurface.Auth.AspNetCore, a public ASP.NET Core adapter package that maps existing host request auth context and named policies into neutralAppSurfaceAuthContextandAppSurfaceAuthResultvalues. The adapter registers its own request-context services, leaves schemes/policies/middleware/challenges/forbids/redirects with the host, reports missing policy/service/subject setup failures with safe diagnostics, and includes an executable local proof example. - AppSurface Flow is now a first-class package family.
ForgeTrust.AppSurface.Flowprovides stablenet10.0typed input/output port process contracts, generated-case authoring attributes and analyzer support, inferred graph mapping for unambiguous ports, discriminated outcome records, graph validation, a definition registry, and an in-memory runner, whileForgeTrust.AppSurface.Flow.DurableTaskadds a passive Durable Task adapter boundary with runner/client services, resume-event authorization, timeout, late-event and retry behavior, and context serialization validation. Semantic Kernel remains out of v1 scope. - Release preparation now generates per-version release evidence bundles at
releases/v{version}.evidence.json, and publish validation checks the bundle at the annotated tag commit before GitHub Release creation. The bundle proves repository release-artifact consistency; it is not a signature or hosted-build attestation. - AppSurface CI coverage now runs through a dedicated
ForgeTrust.AppSurface.CoverageRunnertool behind the stablescripts/coverage-solution.shentrypoint. The runner writes independent per-project coverage/JUnit artifacts, captures stable per-project logs, supportsCOVERAGE_PARALLELISMfor bounded same-job test concurrency, and keeps the merged Cobertura output path used by Codecov. - The AppSurface CLI now includes
appsurface coverage runas the public package-consumer coverage orchestrator for private .NET repositories. It supports.sln/.slnxdiscovery, repeated--test-project,--dry-run/--list-projects, safe AppSurface-owned output cleanup, stable per-project artifact directories, package-owned ReportGenerator merging, and Coverlet-required local test orchestration without mutating consumer projects or reading consumer tool manifests. - The AppSurface CLI now includes
appsurface coverage mergefor private CI matrix fan-in and custom coverage producers. It recursively selects shard files namedcoverage.cobertura.xml, stages them through AppSurface-owned merge input directories to avoid command-line length issues, merges with the CLI package's ReportGenerator dependency, writessummary.txtandtimings.json, rejects source/output overlap, and uses reservedASCOV130throughASCOV139diagnostics. - Coverage runs now emit
slow-test-diagnostics.mdandslow-test-diagnostics.jsonnext to the merged coverage artifacts. The diagnostics rank project and JUnit test-case timings, preserve best-effort parser warnings without changing coverage exit codes, and report diagnostic aggregation overhead in seconds and as a percent of total runner time. - The AppSurface CLI now includes
appsurface coverage gatefor private Cobertura threshold enforcement. The command writescoverage-gate.jsonandcoverage-gate.md, optionally appends the Markdown result to GitHub Actions step summaries, usesASCOV###diagnostics for CI failures, and keeps coverage upload/trend/dashboard behavior out of the v1 gate. - RazorWire CLI static export now recognizes the inline autoload marker that AppSurface Docs outlines emit for page navigation and materializes
/_content/ForgeTrust.RazorWire/razorwire/page-navigation.jsin CDN exports. AppSurface Docs now mirrors the sharedrazorwire:page-nav:active-changeevent instead of owning duplicate outline scroll/hash tracking, so published docs rely on the same navigation runtime as package consumers. - RazorWire now has first-class section copy for long-form documentation and reference pages. Authored buttons use
data-rw-section-copy, generated buttons opt in withdata-rw-section-copy-target, the lazysection-copy.jsruntime owns clipboard success/fallback state through stabledata-rw-section-copy*hooks, and static export materializes the runtime even when pages rely on lazy<rw:scripts/>detection. - AppSurface Web browser status-page re-execution now preserves the original
401,403, or404response status while rendering conventional browser recovery pages, so standalone docs 404 recovery keepsNotFoundsemantics across supported runtimes. razorwire exportandappsurface exportnow accept--publish-root-extras <manifest>for explicit single-file publish-root extras such as GitHub PagesCNAME, withRWEXPORT007validation for schema, symlink, reserved provider file, generated-output collision, existing-target, and exact release archive incompatibility failures.appsurface docs exportremains intentionally clean and does not expose the option for exact docs archive artifacts.- Package consumers can now follow a package-first AppSurface Web quickstart from a fresh
dotnet new webapp, installForgeTrust.AppSurface.Web, and verify the first route before choosing optional modules. - AppSurface Web modules now have a root-first
ConfigureEndpointAwareMiddlewarehook that runs after routing and AppSurface CORS but before endpoint execution, giving root or host integration modules a safe place to register global authentication and authorization middleware while feature modules keep endpoint mapping inConfigureEndpoints. - AppSurface Docs Turbo-frame navigation now preserves cross-page heading fragments, so generated package chooser links land directly on the package-first quickstart section instead of the top of the target page.
ForgeTrust.AppSurface.Aspirenow includes a working local Aspire AppHost example atexamples/aspire-apphost, stronger package guidance for profile and component composition, and explicit troubleshooting for-- local, generatedProjects.*references, duplicate resources, and unsupported deployment/pass-through arguments.
CI and package validation
- CI now includes a measured NuGet cache rollout for selected build, docs export, and code-quality jobs while keeping package-gate restores isolated.
- PackageIndex verification now ignores hidden local cache directories such as
.pnpm-storeand workspace.nuget/packagesso local cache contents do not require package manifest entries. - Fast non-package CI that does not compile Tailwind-consuming projects can now skip Tailwind runtime binary resolution while package validation and release paths force binary resolution on and fail before creating an empty runtime package.
- PackageIndex workflow policy tests now reject additional
TailwindRuntimeBinaryResolutionEnabled=falseforms, including long MSBuild property switches, semicolon property lists, and shell environment assignments. - Tailwind runtime source builds now cache downloaded standalone CLI binaries in a shared user-level cache by default instead of each worktree's
objtree. SetTailwindDownloadCacheRootto choose a CI cache volume or isolate a build.
RazorWire package guidance
- RazorWire page navigation now keeps the active same-page link perceivable inside visible overflowing vertical nav surfaces, using the nav container's
scroll-padding-block/scroll-padding-top/scroll-padding-bottomvalues as reveal insets while preserving document scroll. - RazorWire page-navigation docs now include a compact section-context recipe that derives previous/current/next labels from the existing
razorwire:page-nav:active-changeevent while keeping the labels and chrome app-owned.
AppSurface Docs product example
- AppSurface adds an experimental
ForgeTrust.AppSurface.Intelligencepackage with typed product-intelligence event contracts, privacy validation, no-op default registration, and host-owned sink hooks. AppSurface Docs and RazorWire now dogfood the experimental contracts for safe docs search, recovery-link, form-failure, form-recovery, and stream-admission signals while keeping PostHog as a recipe rather than a package dependency. - AppSurface Docs now has opt-in dual-mode search-quality metrics. Static exports can forward safe docs events to a configured HTTPS collector, while hosted docs can validate browser submissions at
{DocsRootPath}/_metrics/collect, forward accepted docs events through host-owned intelligence sinks, expose bounded process-local Search Quality diagnostics at{DocsRootPath}/_search-quality, and collect recovery-state reader feedback. - AppSurface Docs JavaScript public API harvesting now recognizes documented CSS property hooks such as RazorWire page-navigation scroll-padding contracts, so generated API references can describe browser styling insets without malformed-doclet diagnostics.
Migration watch
- Middleware that needs selected endpoint metadata, including global
UseAuthentication()andUseAuthorization(), should move fromConfigureWebApplicationto the root or host integration module'sConfigureEndpointAwareMiddlewarehook.ConfigureWebApplicationremains the pre-routing hook for middleware that does not inspect endpoint metadata.