Skip to content

refactor(core): consume Nordstein.Core as a git submodule - #538

Merged
JabbaKadabra merged 1 commit into
masterfrom
claude/core-submodule
Aug 13, 2026
Merged

refactor(core): consume Nordstein.Core as a git submodule#538
JabbaKadabra merged 1 commit into
masterfrom
claude/core-submodule

Conversation

@JabbaKadabra

Copy link
Copy Markdown
Collaborator

Completes the split that #535 set up. Nordstein.Core now lives in its own public repository, NordsteinSoftware/Nordstein.Core, and Proxytrace consumes it as a git submodule at core/. The in-repo staging copy is removed.

The extraction

Run against the merged master with git filter-repo, mapping the pre-move paths (Proxytrace.Common/, Proxytrace.Common.Tests/, Proxytrace.Testing/) onto the current core/ layout — not git subtree split, which follows paths without renames and would have collapsed everything to the single move commit. Result: 28 commits of real history in the new repo, back through the licensing subsystem, the secrets-at-rest retrofit and the original rename to proxytrace, so git blame on Core still points at the change that shaped each line.

Verified standalone in a scratch clone before pushing (no parent directory to inherit from): dotnet build (0/0), dotnet test (198 passed), dotnet pack (4 packages). Two standalone-only fixups landed on top in the Core repo: a .gitignore (Proxytrace's root one didn't come across) and a README/PUBLISHING rewrite for the standalone reality.

Why a submodule (not a sibling checkout or packages)

core/ is a submodule pinned to a specific Core commit. This was chosen deliberately:

  • No feed decision required. A sibling ../Core/ checkout can't be seen from a Docker build context, which would have forced release images onto package mode and therefore onto a published feed — dragging the feed/licence/prefix decisions in core/PUBLISHING.md onto the critical path. The submodule keeps core/ inside the build context, so source mode works everywhere, including Docker, with nothing published.
  • Proxytrace stays publicly buildable. Nordstein.Core is public (mirrors Proxytrace), so anonymous --recurse-submodules clones and CI's GITHUB_TOKEN both read it — no 401 for outside contributors.
  • A Core edit stays a one-build change. Commit in the Nordstein.Core repo, then bump the submodule pointer here.

The reference machinery is unchanged: NordsteinCorePath already defaults to core/ and UseLocalCore flips on when core/Nordstein.Core.sln exists, so source mode, the Dockerfile restore layers and detect-changes see the same core/ paths they always have.

What changed here

Area Change
.gitmodules + core gitlink core/ is now a submodule pinned to Nordstein.Core main
CI (ci, e2e, perf, codeql, release) checkout with submodules: recursive on the 7 jobs that build core/ or the Docker context; the diff-only jobs (changes, secrets, frontend, manual, release meta/release) are left alone
detect-changes a submodule bump shows in the diff as the bare path core (no trailing slash) plus .gitmodules; both now count as backend changes
Directory.Build.props dropped the git subtree split / sibling-checkout framing from the comments
docs/code-reuse.md, docs/commands.md submodule reality + git clone --recurse-submodules

No product code changed.

Verification

  • dotnet build core/Nordstein.Core.sln — clean, standalone (through the submodule)
  • dotnet build Proxytrace.sln (source mode against the submodule) — 0 warnings, 0 errors
  • Core standalone tests: 198 passed (in the extraction check)
  • CI's backend (both solutions) and core-package (product against packed .nupkgs) exercise both modes on this PR.

No user-facing change, so no CHANGELOG entry (same as #535).

Follow-ups (not in this PR)

  • CI for the Nordstein.Core repo itself — it has no workflows yet; a standalone build/test (and eventually the CI-prerelease pack from PUBLISHING.md) belongs there.
  • Package publishing stays deferred: the feed, Core's licence terms, and the Nordstein.* prefix reservation are unchanged open decisions, now genuinely optional since the submodule needs none of them.
  • Dependabot for submodules — so Core bumps are raised the way package bumps are.

🤖 Generated with Claude Code

https://claude.ai/code/session_01A8tYyCfGKz2dnvzEX2GTyd

Completes the split started in #535. Nordstein.Core now lives in its own public
repository (NordsteinSoftware/Nordstein.Core), extracted with git filter-repo so
the full per-file history came across (28 commits, back to the original rename).
core/ becomes a submodule pinned to that repo; the plain-tracked staging copy is
removed.

The reference machinery is unchanged: NordsteinCorePath already defaults to core/
and UseLocalCore flips on when core/Nordstein.Core.sln exists, so source mode, the
Dockerfile restore layers and detect-changes see the same core/ paths they always
have. A submodule (rather than a sibling checkout or published packages) keeps
Proxytrace publicly buildable with no feed, and keeps a Core edit a one-build change.

- add core/ submodule (.gitmodules) pinned to Nordstein.Core main
- CI / e2e / perf / codeql / release: checkout with submodules: recursive so core/
  is populated for the build and the Docker build context
- detect-changes: a submodule bump shows as the bare path `core` plus .gitmodules;
  treat both as backend changes
- Directory.Build.props: drop the subtree-split / sibling-checkout framing
- docs/code-reuse.md, docs/commands.md: submodule reality + --recurse-submodules

Verified: Core standalone build + 198 tests; full Proxytrace.sln source-mode build
(0 warnings, 0 errors).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A8tYyCfGKz2dnvzEX2GTyd
@JabbaKadabra
JabbaKadabra merged commit cc76fde into master Aug 13, 2026
15 checks passed
@JabbaKadabra
JabbaKadabra deleted the claude/core-submodule branch August 13, 2026 16:49
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