Skip to content

Trusted publishing migration, single workflow.yml consolidation, probe mode (nuru 458) - #572

Merged
StevenTCramer merged 26 commits into
masterfrom
dev
Aug 8, 2026
Merged

Trusted publishing migration, single workflow.yml consolidation, probe mode (nuru 458)#572
StevenTCramer merged 26 commits into
masterfrom
dev

Conversation

@StevenTCramer

Copy link
Copy Markdown
Collaborator

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

StevenTCramer and others added 26 commits June 17, 2026 11:09
…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>
@StevenTCramer
StevenTCramer merged commit 3325d1a into master Aug 8, 2026
2 of 3 checks passed
@StevenTCramer
StevenTCramer deleted the dev branch August 8, 2026 14:23
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