Skip to content

chore(deps): bump .NET 10 + MAF + Aspire to latest patches#18

Merged
hoangsnowy merged 8 commits into
mainfrom
chore/package-bumps
May 30, 2026
Merged

chore(deps): bump .NET 10 + MAF + Aspire to latest patches#18
hoangsnowy merged 8 commits into
mainfrom
chore/package-bumps

Conversation

@hoangsnowy
Copy link
Copy Markdown
Owner

Change description

Mechanical NuGet bumps — safe patch / minor only. Major bumps (xunit v3 3.x, NET.Test.Sdk 18, coverlet 10, JsonSchema.Net 9) stay on a separate PR because they touch test surface.

Package From To
Microsoft.Extensions.* (Http / DI / Options / Logging.Abstractions) 10.0.0 / 10.0.6 10.0.8
Microsoft.Extensions.Http.Resilience 10.0.0 10.6.0
Microsoft.AspNetCore.* (OpenIdConnect / JwtBearer / OpenApi / SignalR.Client / DataProtection.Abstractions) 10.0.0 10.0.8
Microsoft.EntityFrameworkCore (+ .Design / .InMemory) 10.0.0 10.0.8
Microsoft.EntityFrameworkCore.Relational 10.0.8 (new pin)
Npgsql.EntityFrameworkCore.PostgreSQL 10.0.0 10.0.2
Microsoft.Agents.AI / .OpenAI / .Workflows 1.7.0 1.8.0
Aspire.Hosting / .AppHost / .PostgreSQL / .Azure.PostgreSQL / .Testing 13.3.3 13.3.5
Microsoft.Playwright 1.49.0 1.60.0

Aspire.Hosting.Keycloak stays on 13.3.3-preview.1.26264.13 — its >=13.3.3 floor is satisfied and no newer preview is published on that line.

Why the EFCore pin

Microsoft.Agents.AI* pulls Microsoft.EntityFrameworkCore 10.0.4 transitively. Without an explicit project-level pin to 10.0.8, MSBuild picks 10.0.4 as the "primary" winner — but Npgsql 10.0.2 + EFCore.Design 10.0.8 deploy Microsoft.EntityFrameworkCore.Relational 10.0.8 into the output folder, which then can't load Core 10.0.4 at runtime. ModuleLoader.DiscoverModules blows up with ReflectionTypeLoadException.

Fix: explicit <PackageReference> to Microsoft.EntityFrameworkCore + .Relational in the three modules that own a DbContext (AppConfig, Pipeline, Tenants). 0 warnings, 0 errors after.

Type of change

  • Infrastructure / CI configuration

Checklist

  • dotnet build Release: 0 warnings, 0 errors
  • dotnet test: 218 passed, 5 skipped (live-smoke)
  • No secrets committed
  • README / docs updated — N/A

hoangsnowy and others added 8 commits May 30, 2026 11:20
Extract SignupValidation static helper consumed by both Blazor Signup
page and /tenants/register endpoint so form-side and server-side rules
cannot drift. Slug regex per plan: lowercase, internal hyphens only,
1-32 chars. Password: ≥12 chars + upper/lower/digit/symbol. Email via
MailAddress round-trip. 16 new test cases.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Wire MailHog into Aspire AppHost (SMTP 1025, UI 8025) and point the
realm smtpServer block at it. Set realm verifyEmail:true so unverified
users cannot log in. KeycloakAdminClient: when sendVerifyEmail flips
on, leave emailVerified=false and trigger Keycloak's execute-actions-
email; for self-signup (password supplied) the action list drops
UPDATE_PASSWORD and keeps only VERIFY_EMAIL. Signup page now passes
sendVerifyEmail:true and lands on /signup/verify-email with a hint
pointing dev users at MailHog.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
ITenantSignupService dispatches invite / slug / auto-create by request
shape. Keycloak-first ordering so a registry-row failure can roll back
the Keycloak user (new DeleteUserAsync on the admin client).

Invitations are stateless DataProtection time-limited tokens — no DB
table — issued by /tenants/{id}/invitations (admin) and decoded by
/tenants/invitations/preview (public). Trade-off: tokens cannot be
revoked before TTL; keep TTL short for high-trust environments.

Signup page now accepts ?invite=<token>, pre-fills the email from the
invitation, and the Workspace ID field becomes optional (blank →
auto-generated slug). 7 new service tests + saga rollback verified
via NSubstitute.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Closes the four red flags called out in the Epic D plan:

1. agentic-web client: directAccessGrantsEnabled flipped to false so
   Keycloak no longer accepts ROPC on the code-flow client.
2. RequireHttpsMetadata defaults to true; only flipped off in
   appsettings.Development.json. Same change in JwtAuthExtensions.
3. Cookie SecurePolicy = Always in non-Development, SameAsRequest in
   Development (Aspire pins http://localhost:5180 there).
4. agentic-web-dev-secret and admin/admin no longer hardcoded in any
   .cs file. AppHost surfaces them as Aspire Parameters with dev
   defaults in appsettings.json; Web Program throws at startup if
   ClientSecret is missing outside Development. Standalone
   `dotnet run --project src/AgentOs.Web` now expects user-secrets to
   supply the dev secret (Aspire AppHost injects it automatically).

grep agentic-web-dev-secret\|admin/admin --include=*.cs → no matches.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds GET /tenants/{id}/members guarded by Admin policy AND a runtime
ITenantContext match (so an Admin in tenant A cannot list tenant B).
KeycloakAdminClient gains ListUsersByTenantAsync — paged GET + client-
side filter on the tenant attribute, plus a follow-up role-mappings
fetch per user. Bounded by max=200 for v1; larger realms need a
server-side q-search rewrite.

Two new Razor pages under /admin: Members.razor lists the tenant
roster and mints DataProtection invitation URLs (admin pastes them
into chat/email); Settings.razor shows tenant id + name + created-at
read-only.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
New IAuditLog (EF + Null impls) writes append-only rows to
tenants.audit_events for signup-completed, tenant-created, member-
invited, and invitation-minted actions. Writes are best-effort —
audit failure logs a warning but never breaks the surrounding flow.
Reads are tenant-scoped at the repository, then re-checked at the
endpoint against ITenantContext (Admin in tenant A cannot peek at
tenant B's trail).

GET /tenants/{id}/audit + /admin/audit Razor page show newest-first
rows. login.failed action is reserved for a follow-up — wiring it
through cookie / JWT events lands separately.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
KeycloakAdminClient: 4 tests for DeleteUserAsync (no-content,
404 swallowed, 500 throws) and ListUsersByTenantAsync (filter +
role-mapping fetch).

HttpTenantContext: 5 tests for the claims projection — missing-claim
default, normal user, role flattening, IsAdmin off-by-role, and the
multi-value tenant claim edge case.

Epic D delta now sits at ~32 new tests (validation 16 + signup
service 7 + admin REST 4 + tenant context 5). Full unit suite stays
green (218 passed, 5 skipped live-smoke).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Microsoft.Extensions.* 10.0.0 → 10.0.8
- Microsoft.Extensions.Http.Resilience 10.0.0 → 10.6.0
- Microsoft.Extensions.Logging.Abstractions 10.0.6 → 10.0.8
- Microsoft.AspNetCore.* (OpenIdConnect / JwtBearer / OpenApi / SignalR
  Client / DataProtection.Abstractions) 10.0.0 → 10.0.8
- Microsoft.EntityFrameworkCore (+ .Design / .InMemory) 10.0.0 → 10.0.8
- Npgsql.EntityFrameworkCore.PostgreSQL 10.0.0 → 10.0.2
- Microsoft.Agents.AI* 1.7.0 → 1.8.0
- Aspire.Hosting* 13.3.3 → 13.3.5 (Keycloak preview stays on 13.3.3)
- Microsoft.Playwright 1.49.0 → 1.60.0

Three csproj files gain explicit Microsoft.EntityFrameworkCore +
.Relational PackageReference at 10.0.8 — without the pin, MAF's
transitive 10.0.4 wins the conflict resolution, ModuleLoader
ReflectionTypeLoadException blows up loading Relational 10.0.8 from
Npgsql 10.0.2.

Deferred (major bumps, separate PR):
- xunit.v3 1.1 → 3.2
- Microsoft.NET.Test.Sdk 17.13 → 18.6
- coverlet.collector 6.0.4 → 10.0.1
- JsonSchema.Net 7.x → 9.2.1

Build: 0 warnings, 0 errors. Tests: 218 passed, 5 skipped (live-smoke).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@hoangsnowy hoangsnowy merged commit 8965131 into main May 30, 2026
1 check passed
@hoangsnowy hoangsnowy deleted the chore/package-bumps branch May 30, 2026 05:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant