Skip to content

refactor(abstractions)!: break the Core Events↔Abstractions namespace cycle (gh-#445, 2 of 2) - #505

Merged
genwave-radio merged 2 commits into
mainfrom
fix/gh-445-core-events-abstractions-cycle
Aug 14, 2026
Merged

refactor(abstractions)!: break the Core Events↔Abstractions namespace cycle (gh-#445, 2 of 2)#505
genwave-radio merged 2 commits into
mainfrom
fix/gh-445-core-events-abstractions-cycle

Conversation

@genwave-radio

Copy link
Copy Markdown
Collaborator

Second half of #445closes #445 once both are in. Stacked on the Api↔Stats PR (merge that first; merge-commit, not squash, per house style).

⚠️ MERGING THIS COMMITS THE NEXT GenWave.Abstractions RELEASE TO v5.0.0

NoOpStationEventSink is a public type in the published GenWave.Abstractions package (it physically lives in that project despite the GenWave.Core.* namespace — the deliberate pre-extraction-namespace pattern). This PR moves it GenWave.Core.EventsGenWave.Core.Abstractions, which is a breaking surface change under the package README's semver contract — same mechanics as the ContextContent lesson: publish-nuget derives the version from the tag and no CI gate catches it, so the constraint lives here and in the commit message (refactor!).

There is no non-breaking shape for this cycle. IStationEventSink.Publish(StationEvent) must reference Events, so any implementing type in Events closes the loop — and any old-namespace shim would have to implement the interface, recreating the exact edge being removed. Fixing cycle 1 costs a major, full stop.

🎚️ Your call, Dean: merge when you're ready to spend v5.0.0 (or want to batch it with other breaking wishes) — or park this PR and the baseline honestly keeps the one Core row until then. The sibling PR is free either way.

🔧 The change: the no-op moves beside its interface (issue's own fix sketch); using/doc-ref ripple across 6 files; SEAMS.md regenerated via tools/SeamIndexGenerator (it names the type's home, byte-for-byte drift-checked by Story294); baseline dictionary now empty — the guard runs with a clean slate, ready for the law-promotion /design step the issue records.

dotnet build GenWave.sln zero warnings; Architecture.Tests 104/104; Core.Tests 144/144. Final tree verified byte-identical to the single-branch build that also ran Orchestration/Host targeted suites.

… cycle (gh-#445)

NoOpStationEventSink implemented IStationEventSink from the Events
namespace while the interface's signature reaches back to StationEvent
— the loop is inherent to the split, so the no-op moves beside its
interface into GenWave.Core.Abstractions. BREAKING for the published
GenWave.Abstractions package surface (public type changes namespace):
the next Abstractions release tag must be a major (5.0.0), per the
package README's semver contract. Empties the gh-#445 baseline;
SEAMS.md regenerated (names the type's new home).
@genwave-radio
genwave-radio merged commit 1a28bf4 into main Aug 14, 2026
11 checks passed
@genwave-radio
genwave-radio deleted the fix/gh-445-core-events-abstractions-cycle branch August 14, 2026 01:05
@github-actions github-actions Bot locked and limited conversation to collaborators Aug 14, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

arch: two namespace cycles found by the new cycle-freedom guard — Core Events↔Abstractions, Host Api↔Stats

1 participant