Skip to content

Align public logging contracts - #4274

Merged
thomhurst merged 2 commits into
mainfrom
issue-4230-logging-surface
Aug 29, 2026
Merged

Align public logging contracts#4274
thomhurst merged 2 commits into
mainfrom
issue-4230-logging-surface

Conversation

@thomhurst

Copy link
Copy Markdown
Owner

Closes #4230

Summary

  • expose Microsoft.Extensions.Logging.ILogger from pipeline contexts
  • replace IModuleLoggerProvider with IModuleLoggerAccessor
  • split summary writes (ISummaryLogger) from reads (ISummaryLogReader)
  • update DI, integrations, analyzers, docs, API baselines, and focused tests

Validation

  • core, Git, GitHub, and analyzer Release builds
  • focused core logging/context/HTTP tests
  • focused Git and GitHub summary tests
  • analyzer ILogger and Console tests
  • dotnet format ModularPipelines.slnx --verify-no-changes --severity info

The shared PublicAPI baseline on current main still depends on #4262; rebase after that merges.

@thomhurst

Copy link
Copy Markdown
Owner Author

@claude review

@coderabbitai

coderabbitai Bot commented Aug 28, 2026

Copy link
Copy Markdown

Warning

Review limit reached

Next included review available in 1 minute.

View limit details

Limit details: You’ve used all 4 included reviews currently available.

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Learn how review limits work.

Review configuration:

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: a05a037b-7ccb-4af8-aeff-569cbf85870c

📥 Commits

Reviewing files that changed from the base of the PR and between 56a3e4d and c1c2a5c.

📒 Files selected for processing (55)
  • RELEASE_NOTES_V4.md
  • docs/docs/how-to/logging.md
  • docs/docs/how-to/secrets.md
  • src/ModularPipelines.Analyzers/ModularPipelines.Analyzers.CodeFixes/LoggerInConstructorCodeFixProvider.cs
  • src/ModularPipelines.Analyzers/ModularPipelines.Analyzers.Test/ModularPipelinesAnalyzersConsoleUnitTests.cs
  • src/ModularPipelines.Analyzers/ModularPipelines.Analyzers.Test/ModularPipelinesAnalyzersILoggerUnitTests.cs
  • src/ModularPipelines.Analyzers/ModularPipelines.Analyzers/Resources.Designer.cs
  • src/ModularPipelines.Analyzers/ModularPipelines.Analyzers/Resources.resx
  • src/ModularPipelines.Git/GitVersioning.cs
  • src/ModularPipelines.GitHub/GitHubMarkdownSummaryGenerator.cs
  • src/ModularPipelines/Context/Downloader.cs
  • src/ModularPipelines/Context/IPipelineContext.cs
  • src/ModularPipelines/Context/ModuleContext.cs
  • src/ModularPipelines/Context/ModuleHookContext.cs
  • src/ModularPipelines/Context/PipelineContext.cs
  • src/ModularPipelines/DependencyInjection/DependencyInjectionSetup.cs
  • src/ModularPipelines/Distributed/Master/DistributedModuleExecutor.cs
  • src/ModularPipelines/Distributed/Worker/WorkerModuleExecutor.cs
  • src/ModularPipelines/Engine/DependencyGraphExporter.cs
  • src/ModularPipelines/Engine/ModuleExecutionPipeline.cs
  • src/ModularPipelines/Engine/ModulePlanningSkipEvaluator.cs
  • src/ModularPipelines/Engine/PipelinePlanner.cs
  • src/ModularPipelines/Engine/SafeModuleEstimatedTimeProvider.cs
  • src/ModularPipelines/Http/DurationLoggingHttpHandler.cs
  • src/ModularPipelines/Http/Http.cs
  • src/ModularPipelines/Http/HttpLogger.cs
  • src/ModularPipelines/Http/IHttpLogger.cs
  • src/ModularPipelines/Http/RequestLoggingHttpHandler.cs
  • src/ModularPipelines/Http/ResilienceHttpHandler.cs
  • src/ModularPipelines/Http/ResponseLoggingHttpHandler.cs
  • src/ModularPipelines/Http/StatusCodeLoggingHttpHandler.cs
  • src/ModularPipelines/IConsoleWriter.cs
  • src/ModularPipelines/Logging/CommandLogger.cs
  • src/ModularPipelines/Logging/IInternalModuleLoggerAccessor.cs
  • src/ModularPipelines/Logging/IInternalSummaryLogger.cs
  • src/ModularPipelines/Logging/IModuleLogger.cs
  • src/ModularPipelines/Logging/IModuleLoggerAccessor.cs
  • src/ModularPipelines/Logging/IModuleLoggerProvider.cs
  • src/ModularPipelines/Logging/ISummaryLogReader.cs
  • src/ModularPipelines/Logging/ISummaryLogger.cs
  • src/ModularPipelines/Logging/ModuleLoggerAccessor.cs
  • src/ModularPipelines/Logging/StackTraceModuleDetector.cs
  • src/ModularPipelines/Logging/SummaryLogger.cs
  • src/ModularPipelines/PublicAPI.Shipped.txt
  • src/ModularPipelines/PublicAPI.Unshipped.txt
  • test/ModularPipelines.Distributed.UnitTests/Master/DistributedModuleExecutorTests.cs
  • test/ModularPipelines.Git.UnitTests/BranchConditionLoggingTests.cs
  • test/ModularPipelines.Git.UnitTests/GitVersioningTests.cs
  • test/ModularPipelines.UnitTests/Context/ContextHierarchyTests.cs
  • test/ModularPipelines.UnitTests/Context/HttpTests.cs
  • test/ModularPipelines.UnitTests/Context/PipelineContextModuleLookupTests.cs
  • test/ModularPipelines.UnitTests/Helpers/DownloaderTests.cs
  • test/ModularPipelines.UnitTests/Logging/ModuleLoggerAccessorTests.cs
  • test/ModularPipelines.UnitTests/Logging/SpectreConsoleLoggerTests.cs
  • test/ModularPipelines.UnitTests/Logging/SummaryLoggerTests.cs

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Aug 28, 2026

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review Completed 2026-08-29T00:48:55.658663Z c1c2a5c New commits
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@greptile-apps

greptile-apps Bot commented Aug 28, 2026

Copy link
Copy Markdown

Greptile Summary

The PR aligns the v4 public logging surface around Microsoft.Extensions.Logging.ILogger and separates summary-writing from summary-reading contracts.

  • Replaces the public module logger provider with an accessor and updates runtime DI and consumers.
  • Introduces ISummaryLogReader while retaining summary writes on ISummaryLogger.
  • Updates integrations, analyzers, documentation, API baselines, and focused tests for the new contracts.

Confidence Score: 5/5

The PR appears safe to merge.

No blocking failure remains.

Important Files Changed

Filename Overview
src/ModularPipelines/Logging/ModuleLoggerAccessor.cs Replaces the public provider pattern with a scoped accessor that resolves the framework-managed logger through the existing module context.
src/ModularPipelines/DependencyInjection/DependencyInjectionSetup.cs Registers the new logger accessor and maps all summary interfaces to one shared SummaryLogger singleton.
src/ModularPipelines/Logging/ISummaryLogger.cs Narrows the public summary writer contract to mutation operations.
src/ModularPipelines/Logging/ISummaryLogReader.cs Introduces a dedicated public contract for reading summary entries and rendered output.
src/ModularPipelines.Analyzers/ModularPipelines.Analyzers.CodeFixes/LoggerInConstructorCodeFixProvider.cs Updates logger-replacement compatibility checks to target the standard ILogger contract while preserving symbol binding.
src/ModularPipelines/Context/IPipelineContext.cs Changes the public context logger type from the framework-specific disposable interface to standard ILogger.
src/ModularPipelines.GitHub/GitHubMarkdownSummaryGenerator.cs Migrates summary output consumption to the new read-only interface.

Class Diagram

%%{init: {'theme': 'neutral'}}%%
classDiagram
    class IPipelineContext {
        +ILogger Logger
        +ISummaryLogger Summary
    }
    class IModuleLoggerAccessor {
        +ILogger Logger
    }
    class ISummaryLogger {
        +Information()
        +Success()
        +Warning()
        +Error()
        +Log()
    }
    class ISummaryLogReader {
        +GetEntries()
        +GetOutput()
    }
    class IInternalSummaryLogger {
        +WriteLogs()
    }
    class SummaryLogger
    IInternalSummaryLogger --|> ISummaryLogger
    IInternalSummaryLogger --|> ISummaryLogReader
    SummaryLogger ..|> IInternalSummaryLogger
    IPipelineContext --> ISummaryLogger
    IPipelineContext --> IModuleLoggerAccessor
Loading

Reviews (4): Last reviewed commit: "test(http): use public logger accessor" | Re-trigger Greptile

@claude claude Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code review

Reviewed the full diff (55 files) for PR #4274, which aligns the public logging surface with Microsoft.Extensions.Logging: context.Logger now returns ILogger instead of the custom IModuleLogger, IModuleLoggerProvider is replaced by IModuleLoggerAccessor, IModuleLogger itself becomes internal, and ISummaryLogger is split into a write-only ISummaryLogger plus a new ISummaryLogReader.

What's good

  • CQS split on summary logging (ISummaryLogger vs ISummaryLogReader) is a solid interface-segregation improvement — consumers that only need to emit summary entries (most modules) no longer see GetEntries/GetOutput, and the one reader (GitHubMarkdownSummaryGenerator) depends only on the read contract. Both are still backed by the same SummaryLogger singleton in DI, so there's no behavioral change, just a narrower public surface.
  • Making IModuleLogger internal and exposing plain ILogger is the right call: it removes the ability for consumers to accidentally call Dispose() on a framework-owned, shared logger, and it lets module code interop naturally with anything written against the standard ILogger abstraction (e.g. NullLogger, existing extension methods) instead of a bespoke type. IModuleLoggerAccessor.Logger preserves the same ambient-resolution/caching behavior (ModuleLoggerAccessor.GetLogger()) under the hood, so this is a pure type-surface narrowing, not a behavior change.
  • I traced every consumer of the renamed/removed types (IModuleLoggerProvider, ISummaryLogger.GetEntries/GetOutput/Info, public IModuleLogger) across src/ and test/, including assemblies outside the core project (ModularPipelines.Testing, ModularPipelines.Git, ModularPipelines.GitHub, analyzers) — all call sites were updated consistently, and the PublicAPI.Shipped.txt/PublicAPI.Unshipped.txt baselines correctly reflect the removed/added public members. InternalsVisibleTo already covers the assemblies (like ModularPipelines.Testing) that still reference the now-internal IModuleLogger.
  • The analyzer's LoggerInConstructorCodeFixProvider was correctly updated to match against Microsoft.Extensions.Logging.ILogger instead of the old IModuleLogger, consistent with context.Logger's new type — the speculative-binding safeguard logic is unaffected.
  • Docs (logging.md, secrets.md) and RELEASE_NOTES_V4.md are updated to match the new API surface.

Minor, non-blocking nit

  • In ModularPipelinesAnalyzersILoggerUnitTests.cs, BadModuleSourceILoggerProvider renames its local variable from loggerProvider to loggerAccessor, but the constructor parameter type is still Microsoft.Extensions.Logging.ILoggerProvider (unrelated to this PR's new IModuleLoggerAccessor). This looks like a global find/replace artifact — the variable name now implies it's testing the new accessor type when it's actually still testing the framework's own ILoggerProvider injection case. Worth a rename back to something like frameworkLoggerProvider for clarity, but it doesn't affect test correctness.

No functional or compile-breaking issues found. Nice, well-scoped refactor with matching test/doc/public-API updates.

@thomhurst

Copy link
Copy Markdown
Owner Author

@claude review

@thomhurst
thomhurst force-pushed the issue-4230-logging-surface branch from 28e598e to 664c591 Compare August 28, 2026 23:49

@claude claude Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code review

Reviewed the full diff for PR #4274 (55 files) at head 664c5911d08a03f12e072eabc577978dc6515fb1, which aligns the public logging surface with Microsoft.Extensions.Logging: context.Logger now returns ILogger instead of the custom IModuleLogger, IModuleLoggerProvider is replaced by IModuleLoggerAccessor, IModuleLogger itself becomes internal, and ISummaryLogger is split into a write-only ISummaryLogger plus a new ISummaryLogReader (with Info renamed to Information).

Note: the previously-reviewed commit (28e598e1...) is no longer reachable — the branch was rebased per the PR description ("rebase after #4262 merges") — so this review re-checks the diff against main from scratch rather than diffing against the prior review.

What's good

  • CQS split on summary logging (ISummaryLogger vs ISummaryLogReader) narrows the surface each consumer sees: modules writing summaries no longer see GetEntries/GetOutput, and the one reader (GitHubMarkdownSummaryGenerator) depends only on ISummaryLogReader. Both are still backed by the same SummaryLogger singleton in DI (DependencyInjectionSetup.cs), so this is a pure interface-segregation improvement with no behavioral change.
  • IModuleLoggerAccessor/IInternalModuleLoggerAccessor split cleanly separates the public, non-disposable ILogger view from the internal IModuleLogger (disposable, framework-owned lifecycle) used for stack-trace-based module detection and scoped caching. ModuleLoggerAccessor.Logger => GetLogger() preserves the exact same ambient-resolution/locking/caching behavior that existed under the old ModuleLoggerProvider.GetLogger() — this is a rename plus a narrower public accessor, not a behavior change.
  • I traced every consumer of the renamed/removed types (IModuleLoggerProvider, ISummaryLogger.Info/GetEntries/GetOutput, public IModuleLogger) across src/ and test/, including ModularPipelines.Git, ModularPipelines.GitHub, the analyzers, and the distributed master/worker executors — all call sites were updated consistently, and PublicAPI.Shipped.txt/PublicAPI.Unshipped.txt correctly move the removed members out of Shipped and the new/renamed members into Unshipped.
  • The analyzer's LoggerInConstructorCodeFixProvider now matches against Microsoft.Extensions.Logging.ILogger instead of the old IModuleLogger, consistent with context.Logger's new type.
  • Docs (logging.md, secrets.md) and RELEASE_NOTES_V4.md are updated to match the new API surface, and the breaking rename ISummaryLogger.InfoInformation is called out in the release notes.

Minor, non-blocking nit (carried over from the prior review, still present)

  • In src/ModularPipelines.Analyzers/ModularPipelines.Analyzers.Test/ModularPipelinesAnalyzersILoggerUnitTests.cs:112, BadModuleSourceILoggerProvider still builds its test source with "ILoggerProvider loggerAccessor" — the constructor parameter type is the framework's own Microsoft.Extensions.Logging.ILoggerProvider (unrelated to this PR's new IModuleLoggerAccessor), but the variable was renamed from loggerProvider to loggerAccessor as part of the refactor's find/replace. The name now misleadingly implies it's testing the new accessor type when it's actually still exercising the "inject the framework's own ILoggerProvider" bad-constructor case. Purely cosmetic (doesn't affect test correctness) — a rename to something like frameworkLoggerProvider would remove the ambiguity, but this doesn't block the PR.

No functional or compile-breaking issues found in the diff. Well-scoped, mechanical refactor with consistent updates across DI, integrations, analyzers, docs, and the public API baseline.

@thomhurst
thomhurst force-pushed the issue-4230-logging-surface branch from 664c591 to 3861690 Compare August 29, 2026 00:29

@claude claude Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code review

Reviewed the full diff for PR #4274 (55 files) at head 3861690782823bae7b7e5fcbac9bf99c9bb2e495. This aligns the public logging surface with Microsoft.Extensions.Logging: context.Logger now returns ILogger instead of the custom IModuleLogger, IModuleLoggerProvider is replaced by IModuleLoggerAccessor (with an internal IInternalModuleLoggerAccessor still exposing GetLogger()/GetLogger(Type) for framework-internal callers), IModuleLogger itself becomes internal, and ISummaryLogger is split into a write-only ISummaryLogger plus a new ISummaryLogReader (with Info renamed to Information).

The branch has been rebased twice since the first review pass on this PR (previously-reviewed heads 28e598e1 and 664c5911 are no longer reachable), so this is effectively a fresh, from-scratch review of the diff against main, plus targeted verification of the one commit that's new since the last review (3861690 – "test(http): use public logger accessor").

What's good

  • CQS split on summary logging (ISummaryLogger vs ISummaryLogReader) is a solid interface-segregation improvement: modules that only write summary entries no longer see GetEntries/GetOutput, and the one reader (GitHubMarkdownSummaryGenerator) depends only on the read contract. Both are still backed by the same SummaryLogger singleton in DependencyInjectionSetup.cs, so it's a pure surface narrowing with no behavioral change.
  • IModuleLoggerAccessor/IInternalModuleLoggerAccessor split cleanly separates the public, non-disposable ILogger view from the internal IModuleLogger (disposable, framework-owned, used for stack-trace-based module detection and per-module caching). ModuleLoggerAccessor.Logger => GetLogger() preserves the exact ambient-resolution/locking/caching behavior that existed under the old ModuleLoggerProvider.GetLogger().
  • I re-traced every consumer of the renamed/removed types (IModuleLoggerProvider, ISummaryLogger.Info/GetEntries/GetOutput, public IModuleLogger) across src/ and test/ModularPipelines.Git, ModularPipelines.GitHub, the analyzers, and the distributed master/worker executors are all updated consistently, and PublicAPI.Shipped.txt/PublicAPI.Unshipped.txt correctly move the removed members out of Shipped and the new/renamed members into Unshipped.
  • New commit check (test/ModularPipelines.UnitTests/Context/HttpTests.cs): rewires mocks from IModuleLoggerProvider/IModuleLogger to IModuleLoggerAccessor/ILogger. I checked whether the tests that now call Mock.Of<IModuleLoggerAccessor>() without stubbing .Logger (which yields a null logger under Moq's loose/DefaultValue.Empty behavior) could cause a NullReferenceException when Http.cs's LogStatusCode/LogDuration invoke logger — they don't, because in every such test _httpLogger is itself a loose Mock.Of<IHttpLogger>() (or the non-logging LegacyBodyLogger test double), so the null logger is only ever passed as an unused argument to a mocked/no-op method, never dereferenced. Tests that route through a real HttpLogger instance correctly stub IModuleLoggerAccessor.Logger to return a real ILogger mock (e.g. lines ~456-483, ~528-545, ~639-656, ~686-708, ~734-751, ~773-791).
  • The analyzer's LoggerInConstructorCodeFixProvider now matches against Microsoft.Extensions.Logging.ILogger instead of the old IModuleLogger, consistent with context.Logger's new type.
  • Docs (logging.md, secrets.md) and RELEASE_NOTES_V4.md are updated to match the new API surface, and the breaking rename ISummaryLogger.InfoInformation is called out in the release notes.

Minor, non-blocking nit (carried over from prior reviews on this PR, still unaddressed)

  • src/ModularPipelines.Analyzers/ModularPipelines.Analyzers.Test/ModularPipelinesAnalyzersILoggerUnitTests.cs:29 still builds BadModuleSourceILoggerProvider from "ILoggerProvider loggerAccessor". The constructor parameter type is the framework's own Microsoft.Extensions.Logging.ILoggerProvider (unrelated to this PR's new IModuleLoggerAccessor), but the variable was renamed from loggerProvider to loggerAccessor — presumably a find/replace artifact — so the name now misleadingly implies it's testing the new accessor type when it's actually still exercising the "inject the framework's own ILoggerProvider" bad-constructor case. Doesn't affect test correctness; a rename to something like frameworkLoggerProvider would remove the ambiguity.

No functional or compile-breaking issues found. This remains a well-scoped, mechanical refactor with consistent updates across DI, integrations, analyzers, docs, tests, and the public API baseline.

Expose standard ILogger, replace the logger provider with an accessor, and separate summary reads from writes.
Keep the logging-precedence regression aligned with the ILogger-based accessor after rebasing the two logging API changes.
@thomhurst

Copy link
Copy Markdown
Owner Author

Rebased onto current main after #4268, combining the logging-contract and module-result PublicAPI additions. Normal core and CI-conditioned API builds pass; 62 focused HTTP/logging tests pass; all 61 PublicAPI baseline pairs and assertion harness pass.

@thomhurst
thomhurst force-pushed the issue-4230-logging-surface branch from 3861690 to c1c2a5c Compare August 29, 2026 00:44

@claude claude Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code review

Reviewed the full diff for PR #4274 (55 files, +308/-283) at head c1c2a5c234c849c32a5e3a271a5421f54cdf4c4b. This aligns the public logging surface with Microsoft.Extensions.Logging: context.Logger now returns ILogger instead of the custom IModuleLogger, IModuleLoggerProvider is replaced by IModuleLoggerAccessor (with an internal IInternalModuleLoggerAccessor still exposing GetLogger()/GetLogger(Type) for framework-internal callers), IModuleLogger itself becomes internal, and ISummaryLogger is split into a write-only ISummaryLogger plus a new ISummaryLogReader (with Info renamed to Information).

The branch has been rebased again since the last review pass (3861690782823bae7b7e5fcbac9bf99c9bb2e495 is no longer reachable), but the diff content against main is identical to what was previously reviewed — same 55 files, same +308/-283 line counts. I re-verified the core accessor split directly rather than relying on that match alone:

  • ModuleLoggerAccessor / IInternalModuleLoggerAccessor split (src/ModularPipelines/Logging/ModuleLoggerAccessor.cs, IModuleLoggerAccessor.cs, IInternalModuleLoggerAccessor.cs): the public surface (IModuleLoggerAccessor.Logger) is a non-disposable ILogger, while the internal interface adds GetLogger()/GetLogger(Type) returning the framework-owned IModuleLogger. Logger => GetLogger() preserves the same AsyncLocal fast-path / stack-trace-fallback / locking behavior that existed before, so this is a pure type-surface narrowing, not a behavior change.
  • CQS split on summary logging (ISummaryLogger vs ISummaryLogReader) is a solid interface-segregation improvement — write-only consumers no longer see GetEntries/GetOutput, the one reader (GitHubMarkdownSummaryGenerator) depends only on the read contract, and both are still backed by the same SummaryLogger singleton in DependencyInjectionSetup.cs, so there's no behavioral change.
  • PublicAPI.Shipped.txt/PublicAPI.Unshipped.txt correctly move the removed members out of Shipped and the new/renamed members into Unshipped, and the analyzer's LoggerInConstructorCodeFixProvider now matches Microsoft.Extensions.Logging.ILogger instead of the old IModuleLogger.
  • Docs (logging.md, secrets.md) and RELEASE_NOTES_V4.md are updated to match, and the breaking rename ISummaryLogger.InfoInformation is called out in the release notes.

Non-blocking, carried over from prior reviews on this PR

  • src/ModularPipelines.Analyzers/ModularPipelines.Analyzers.Test/ModularPipelinesAnalyzersILoggerUnitTests.cs:29 still builds BadModuleSourceILoggerProvider from "ILoggerProvider loggerAccessor". The constructor parameter type is the framework's own Microsoft.Extensions.Logging.ILoggerProvider (unrelated to this PR's new IModuleLoggerAccessor), but the local was renamed loggerProviderloggerAccessor, presumably a find/replace artifact from the accessor rename. The name now implies it's testing the new accessor type when it's actually still exercising the "inject the framework's own ILoggerProvider" bad-constructor case. Doesn't affect test correctness — a rename to something like frameworkLoggerProvider would remove the ambiguity, but this isn't a blocker.

No functional or compile-breaking issues found. Well-scoped, mechanical refactor with consistent updates across DI, integrations, analyzers, docs, tests, and the public API baseline.

@thomhurst
thomhurst merged commit 214fb70 into main Aug 29, 2026
16 checks passed
@thomhurst
thomhurst deleted the issue-4230-logging-surface branch August 29, 2026 01:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant