Trusted publishing migration, single workflow.yml consolidation, probe mode (nuru 458) - #572
Merged
Conversation
…er logging - Retarget to net10.0 (Directory.Build.props); pin global.json to SDK 10.0.301 with rollForward=latestMinor, allowPrerelease=false. - Bump Microsoft.AspNetCore.Components.* and Microsoft.Extensions.* to 10.0.9; Mediator.Abstractions/SourceGenerator to 3.0.2 (drops vulnerable transitive Scriban 6.2.0). - Fix scripts/*.cs runfile shebangs: /usr/bin/dotnet -> /usr/bin/env -S dotnet -- so they resolve dotnet via PATH while still passing args through to the app. - Add Microsoft.Hosting.Lifetime: Information to test-app-server appsettings so the 'Now listening on...' URL prints on startup. - Remove obsolete aider.instructions.md and qodana.yaml. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Tasks 040-047 + 049/059. Libraries and test-app build and run; counter pipeline validated end-to-end in the browser. Samples and persistence still pending (see below). Core API migration: - ActionHandler base + all handlers return ValueTask<Unit>; pipeline behaviors use MessageHandlerDelegate (next stays 2nd param, cancellationToken last); pre/post processors extend MessagePreProcessor/MessagePostProcessor; notification handlers return ValueTask. Behavior constraints changed notnull -> IMessage. - Registration: consumer owns AddMediator(...) with compile-time assembly markers and GenerateTypesAsInternal=true; library registers only its own pipeline behaviors as runtime open-generic IPipelineBehavior and references Mediator.Abstractions only (generator moved to the consumer to avoid a duplicate/colliding AddMediator). - Action/Handler types made public (cross-assembly registration); architecture policies updated BeInternal -> BePublic to match. - Persistence source generator emits ValueTask<Unit> handlers. - test-app: pre/post-pipeline notifications made non-generic (Mediator can't generate Publish for open-generic notifications); .NET 10 [PersistentState] alias added. Also fixes the RouteState.GoBack off-by-one (task 059) with regression tests. Verified: timewarp-state + timewarp-state-plus build clean; timewarp-state-tests (16) and timewarp-state-plus-tests (11) pass; test-app runs and the counter dispatches through the migrated pipeline (3 -> 8 -> 13). Pending (tracked): 6 samples need AddMediator (task 049); persistence is runtime-broken because Mediator's generator can't see TimeWarp's generated Load handlers (task 075); analyzer-tests reference the old Contracts dll (task 048). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Full exhaustive review (code-review-2026-06-11.md) plus kanban tasks for the findings: 058 (TimeWarp.State.Telemetry / OTel+Aspire to replace ReduxDevTools) and 060-074 (Store races, StateTransaction error path, component param bugs, JS interop leak, timer wiring, persistence serializer/key, internal-action marker, render-subscription suppression, Subscriptions thread-safety, hot-path StackTrace, analyzer type matching, source-generator nested-class handling, typed persistence load contract, cleanup batch, and the ganda repo audit fixes). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The migration plan never had a 'migrate samples' task; the 6 sample apps need the same consumer-side AddMediator wiring as test-app. Track separately so it gets its own commit. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Each of the 6 sample apps now owns AddMediator (Mediator registers handlers at compile time): add Mediator.SourceGenerator to the csproj, call AddMediator with GenerateTypesAsInternal=true and compile-time assembly markers (typeof(Program), TimeWarp.State, +TimeWarp.State.Plus for action-tracking/routing), and add 'global using Mediator;' (handlers now reference Mediator.Unit). Full-solution dotnet build (timewarp-state.slnx) is now GREEN — 0 errors. Note: samples consume TimeWarp.State/Plus as packages from the local feed; a stale cached 12.0.0-beta.3 had to be refreshed (repack + clear cache). Same-version local-feed repacks are fragile; consider a beta bump (task 051) or project references for active dev. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Reference Mediator.dll instead of TimeWarp.Mediator.Contracts.dll (the Mediator.Abstractions package ships its assembly as Mediator.dll, not Mediator.Abstractions.dll as the task assumed). - Set ReferenceAssemblies.Net.Net100 on each analyzer test so the in-memory compilation's System.Runtime matches net10 TimeWarp.State / net8 Mediator (fixes CS1705). - Bump Microsoft.CodeAnalysis.CSharp.Analyzer.Testing 1.1.2 -> 1.1.4 (1.1.2 only had up to Net90). All 4 analyzer tests pass. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Mediator registers handlers at compile time and cannot see another generator's output, so the
per-state generated LoadActionSet.Handler was never registered and dispatching the load action
threw MissingMessageHandlerException at runtime ('persistence fails').
Replace it with a single hand-written LoadPersistentStateRequest + handler in Plus (visible to
Mediator's generator). Both auto-load (StateInitializedNotificationHandler, now simplified -
no AssemblyQualifiedName string-mangling / Type.GetType / Activator) and the generated Load()
method dispatch it. The generator now emits only a thin Load() wrapper (dropped the dead
LoadActionSet.Action/Handler and the never-handled StateLoadedNotification).
Verified in the running test app: no MissingMessageHandlerException; the load handler runs
(WASM logs show StateInitializedNotificationHandler -> PersistenceService.LoadState).
NOTE: persistence still does not round-trip end-to-end - state is not restored on reload. That
is a separate deserialize/serializer-options bug (task 065), not the registration gap fixed here.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Start work on analyzer State type matching fix and debug scaffolding removal. 🤖 Generated with [opencode](https://opencode.ai) Co-Authored-By: opencode <noreply@opencode.ai>
Document metadata-name State matching, shared helper, tests, and TWD001 cleanup. 🤖 Generated with [opencode](https://opencode.ai) Co-Authored-By: opencode <noreply@opencode.ai>
Resolving TimeWarp.State.State`1 via GetTypeByMetadataName avoids false TWS001 hits on foreign State<T> bases. Drop dead debug diagnostics that could freeze consumer builds if LaunchDebugger were uncommented. 🤖 Generated with [opencode](https://opencode.ai) Co-Authored-By: opencode <noreply@opencode.ai>
Analyzer no longer ships TWD001; leftover severity setting was incomplete cleanup. 🤖 Generated with [opencode](https://opencode.ai) Co-Authored-By: opencode <noreply@opencode.ai>
Record implementation summary, files changed, and test outcomes before marking done. 🤖 Generated with [opencode](https://opencode.ai) Co-Authored-By: opencode <noreply@opencode.ai>
Analyzer State metadata matching and TWD001 cleanup complete. 🤖 Generated with [opencode](https://opencode.ai) Co-Authored-By: opencode <noreply@opencode.ai>
…llout) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Start trusted-publishing migration for NuGet publish workflow.
Record trusted-publishing migration plan for ci-cd.yml.
Replace long-lived PUBLISH_TO_NUGET_ORG secret with nuget/login@v1, gate workflow_dispatch publish, and only run on published releases.
Folderize task 077, record clean Phase 4b disposition, Results with How to validate, and operator follow-ups for E2E verify and secret revoke.
Trusted-publishing workflow migration complete with Results documented.
…u 458-009) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… ruling) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Start single-workflow.yml consolidation for trusted publishing shape.
Org trusted-publishing shape: one workflow.yml only. Fold OIDC-migrated ci-cd.yml content (nuget/login preserved); drop abandoned sync-configurable-files cruft. release trigger already published.
Single canonical workflow.yml consolidation complete for timewarp-state.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
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.
Fleet-executed and session-verified: OIDC trusted publishing migration (task 077), single-workflow consolidation with release:published trigger fix (078), probe mode (079). All work reviewed per task records.
🤖 Generated with Claude Code