[Backend][Refactor] Finish the SpikerSoft.Business decomposition — physically move the 13 linked source files into their slice projects, and adopt 'new code goes in the slice directory'
#566
QA Team — filed 2026-07-14 from the README audit, at spikerj's direction (the audit found no existing ticket tracking the completion of this work, and new hires hit the half-migrated state immediately).
Current state (verified in the csproj files): the decomposition slices exist and compile, but 13 source files are still <Compile Include="..\SpikerSoft.Business\..." Link="..."/> links rather than physically-moved files (done deliberately to preserve git history):
Slice
Linked files
SpikerSoft.Business.CodeExecution
9
SpikerSoft.Business.Scheduling
2
SpikerSoft.Business.Books
1
SpikerSoft.Business.Identity
1
SpikerSoft.Business.{Ai,Edge,Metrics}
0 (fully physical)
Asks:
Physically move the 13 remaining files into their slice directories (git preserves history through moves well enough with --follow; the link-to-preserve-history rationale has served its purpose).
Adopt the rule (confirmed by spikerj 2026-07-14): new slice code goes in the slice project's own directory (like CodeExecution's Sql/ and Services/Git/), never in SpikerSoft.Business/Domain/... to be linked. The audit's new per-project READMEs state this rule; this ticket is what makes it true in the tree.
Consider whether namespaces on slice-owned classes (e.g. SpikerSoft.Business.Services.Git on CodeExecution-owned provisioners) should be renamed to match their slice, or stay for consumer compatibility — a deliberate call, not drift.
Why now: the README audit documents the phases and the linked-file mechanism for new hires, but a documented half-migration is still a half-migration; this ticket is the thing that lets those READMEs eventually say "one file, one home".
**QA Team** — filed 2026-07-14 from the README audit, at spikerj's direction (the audit found no existing ticket tracking the completion of this work, and new hires hit the half-migrated state immediately).
**Current state (verified in the csproj files):** the decomposition slices exist and compile, but **13 source files are still `<Compile Include="..\SpikerSoft.Business\..." Link="..."/>` links** rather than physically-moved files (done deliberately to preserve git history):
| Slice | Linked files |
|---|---|
| SpikerSoft.Business.CodeExecution | 9 |
| SpikerSoft.Business.Scheduling | 2 |
| SpikerSoft.Business.Books | 1 |
| SpikerSoft.Business.Identity | 1 |
| SpikerSoft.Business.{Ai,Edge,Metrics} | 0 (fully physical) |
**Asks:**
1. **Physically move** the 13 remaining files into their slice directories (git preserves history through moves well enough with `--follow`; the link-to-preserve-history rationale has served its purpose).
2. **Adopt the rule** (confirmed by spikerj 2026-07-14): **new slice code goes in the slice project's own directory** (like CodeExecution's `Sql/` and `Services/Git/`), never in `SpikerSoft.Business/Domain/...` to be linked. The audit's new per-project READMEs state this rule; this ticket is what makes it true in the tree.
3. Consider whether namespaces on slice-owned classes (e.g. `SpikerSoft.Business.Services.Git` on CodeExecution-owned provisioners) should be renamed to match their slice, or stay for consumer compatibility — a deliberate call, not drift.
**Why now:** the README audit documents the phases and the linked-file mechanism for new hires, but a documented half-migration is still a half-migration; this ticket is the thing that lets those READMEs eventually say "one file, one home".
Ask 1: all formerly link-included sources physically moved into their slices via pure git mv (556 files, 100% similarity). Note: the actual linked set was bigger than the ticket's '13 files' — the CodeExecution slice also glob-linked Domain/CodeExecution/** (49) and Domain/Lessons/** (485), so the PR moves the whole set; details + a scope note in the PR body.
Ask 2: the 'new code goes in the slice directory' rule is now the physical reality; READMEs and the wasm-link-include rule updated accordingly.
Ask 3 (namespaces): kept as SpikerSoft.Business.* — deliberate consumer-compatibility call, documented in the slice READMEs and csproj comments.
Also fixed en route: spikersoft-api/notifications/tests CI workflows only path-matched 'SpikerSoft.Business/', so after the move slice edits would have silently stopped triggering them — they now also match 'SpikerSoft.Business.*/'.
Verified: SpikerSoft.sln + UnitTests.slnf build clean, full unit suite passes (7,555 Business.Tests among them), Wasm builds with all 8 es translation resources embedded under the pinned names.
Deliberately left as follow-ups (per the audit READMEs): per-slice test projects (#478 convention), a Profile slice for ProfileCompletionValidator, the Business.Identity boundary call.
Will close after the PR merges.
PR up: spikersoft-backend PR #339 (https://git.spikersoft.com/spikerj/spikersoft-backend/pulls/339) — refactor/566-finish-business-decomposition.
- Ask 1: all formerly link-included sources physically moved into their slices via pure git mv (556 files, 100% similarity). Note: the actual linked set was bigger than the ticket's '13 files' — the CodeExecution slice also glob-linked Domain/CodeExecution/** (49) and Domain/Lessons/** (485), so the PR moves the whole set; details + a scope note in the PR body.
- Ask 2: the 'new code goes in the slice directory' rule is now the physical reality; READMEs and the wasm-link-include rule updated accordingly.
- Ask 3 (namespaces): kept as SpikerSoft.Business.* — deliberate consumer-compatibility call, documented in the slice READMEs and csproj comments.
Also fixed en route: spikersoft-api/notifications/tests CI workflows only path-matched 'SpikerSoft.Business/**', so after the move slice edits would have silently stopped triggering them — they now also match 'SpikerSoft.Business.*/**'.
Verified: SpikerSoft.sln + UnitTests.slnf build clean, full unit suite passes (7,555 Business.Tests among them), Wasm builds with all 8 es translation resources embedded under the pinned names.
Deliberately left as follow-ups (per the audit READMEs): per-slice test projects (#478 convention), a Profile slice for ProfileCompletionValidator, the Business.Identity boundary call.
Will close after the PR merges.
Resolved in spikersoft-backend PR #339 (merged to master). All formerly link-included sources physically moved into their slice projects (556 files, pure git mv), 'new code goes in the slice directory' is now the tree's reality, and namespaces stay SpikerSoft.Business.* as a documented consumer-compatibility call. Follow-ups tracked in the PR body / READMEs: per-slice test projects, a Profile slice for ProfileCompletionValidator, the Business.Identity boundary call. Closing.
Resolved in spikersoft-backend PR #339 (merged to master). All formerly link-included sources physically moved into their slice projects (556 files, pure git mv), 'new code goes in the slice directory' is now the tree's reality, and namespaces stay SpikerSoft.Business.* as a documented consumer-compatibility call. Follow-ups tracked in the PR body / READMEs: per-slice test projects, a Profile slice for ProfileCompletionValidator, the Business.Identity boundary call. Closing.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
QA Team — filed 2026-07-14 from the README audit, at spikerj's direction (the audit found no existing ticket tracking the completion of this work, and new hires hit the half-migrated state immediately).
Current state (verified in the csproj files): the decomposition slices exist and compile, but 13 source files are still
<Compile Include="..\SpikerSoft.Business\..." Link="..."/>links rather than physically-moved files (done deliberately to preserve git history):Asks:
--follow; the link-to-preserve-history rationale has served its purpose).Sql/andServices/Git/), never inSpikerSoft.Business/Domain/...to be linked. The audit's new per-project READMEs state this rule; this ticket is what makes it true in the tree.SpikerSoft.Business.Services.Giton CodeExecution-owned provisioners) should be renamed to match their slice, or stay for consumer compatibility — a deliberate call, not drift.Why now: the README audit documents the phases and the linked-file mechanism for new hires, but a documented half-migration is still a half-migration; this ticket is the thing that lets those READMEs eventually say "one file, one home".
PR up: spikersoft-backend PR #339 (spikerj/spikersoft-backend#339) — refactor/566-finish-business-decomposition.
Also fixed en route: spikersoft-api/notifications/tests CI workflows only path-matched 'SpikerSoft.Business/', so after the move slice edits would have silently stopped triggering them — they now also match 'SpikerSoft.Business.*/'.
Verified: SpikerSoft.sln + UnitTests.slnf build clean, full unit suite passes (7,555 Business.Tests among them), Wasm builds with all 8 es translation resources embedded under the pinned names.
Deliberately left as follow-ups (per the audit READMEs): per-slice test projects (#478 convention), a Profile slice for ProfileCompletionValidator, the Business.Identity boundary call.
Will close after the PR merges.
Resolved in spikersoft-backend PR #339 (merged to master). All formerly link-included sources physically moved into their slice projects (556 files, pure git mv), 'new code goes in the slice directory' is now the tree's reality, and namespaces stay SpikerSoft.Business.* as a documented consumer-compatibility call. Follow-ups tracked in the PR body / READMEs: per-slice test projects, a Profile slice for ProfileCompletionValidator, the Business.Identity boundary call. Closing.