Design Proposal: Excititor Module Filesystem Path
Audience: Sprint authors, reviewers, and new contributors confused by why the Excititor libraries live under the Concelier source tree. This is a proposal recording the recommended course (retain + document), not a directory-move plan being executed.
Status: Proposed (recommendation: retain + document) Date: 2026-05-12 Sprint: docs/implplan/SPRINT_20260512_021_Concelier_Excititor_credentials_resolver_wiring.md — TASK-021-09 Related dossier: Excititor Module Architecture Authors: Project Manager / Excititor
Context
Every Excititor library (StellaOps.Excititor.Core, StellaOps.Excititor.Persistence, StellaOps.Excititor.Export, StellaOps.Excititor.Policy, StellaOps.Excititor.Attestation, all 8 StellaOps.Excititor.Connectors.*, etc. — 17 projects total) lives under src/Concelier/__Libraries/. There is no top-level src/Excititor/ directory.
This is organizationally confusing for sprint scoping: SPRINT_20260512_021 explicitly wanted to scope “Concelier vs Excititor” cleanly and could not without naming the Concelier subdirectory.
Historical note: Excititor was originally a Concelier submodule (VEX ingestion was an internal capability of the advisory engine). The namespace StellaOps.Excititor.* was introduced when Excititor became an independent module, but the filesystem path stuck because moving it was scope-prohibitive.
Options
Option A — Rename to src/Excititor/__Libraries/StellaOps.Excititor.*
Mirrors the Concelier / Scanner / Authority / etc. layout. Clean separation, sprint scoping becomes trivial.
- Pros: filesystem reflects module ownership; sprint authors and new contributors stop being confused; easier to grant per-module CODEOWNERS / file-permissions later.
- Cons: very large churn.
- 10+ solution files reference the current path (39 entries in
src/StellaOps.slnalone; another ~10 across module-scoped slns likeStellaOps.Cli.sln,StellaOps.Policy.sln, etc.). - 49+
.csprojProjectReference paths must be rewritten. - Sprint files, ADRs, dossiers under
docs/modules/excititor/**, and ops runbooks reference the path literally. - CI build scripts and
build-all-services.shenumerate project paths. - Every in-flight branch and every archived sprint file becomes history-only after merge — git blame survives via
--followbut diff review across the rename window is painful.
- 10+ solution files reference the current path (39 entries in
Option B — Retain + document the historical reason
Leave the filesystem layout as-is. Add a short note at the top of docs/modules/excititor/architecture.md and a README.md under src/Concelier/__Libraries/ that explicitly states “Excititor projects live here for historical reasons; the namespace StellaOps.Excititor.* signals the actual module ownership.”
- Pros: zero churn, zero risk; namespace already conveys correct ownership; tooling that walks csproj graphs (Roslyn, dotnet build) is path-agnostic.
- Cons: filesystem layout remains a stumbling block for newcomers until they read the README pointer.
Recommendation
Option B — retain + document.
The rename would touch 60+ files across solution files, csproj graphs, sprint history, dossiers, and CI scripts for purely organizational tidiness. The namespace StellaOps.Excititor.* already carries the ownership signal that matters to compilers, test runners, NuGet packaging, and runtime plugin discovery. The filesystem path is a historical artifact, not an architectural constraint.
Sprint scoping pain is real but bounded: sprint authors can write “Working directory: src/Concelier/__Libraries/StellaOps.Excititor.*” with a short footnote, exactly as TASK-021-07 does today. A __Libraries/README.md makes this footnote unnecessary on the second encounter.
Implementation surface (Option B)
- Add
src/Concelier/__Libraries/README.mdwith the historical note and a one-line table:- “Concelier-owned libs: anything not starting with
StellaOps.Excititor.*.” - “Excititor-owned libs: anything starting with
StellaOps.Excititor.*. These live here for historical reasons; ownership is signaled by the namespace, not the path.”
- “Concelier-owned libs: anything not starting with
- Add a
## Module pathsection near the top ofdocs/modules/excititor/architecture.mdlinking to this proposal. - Update
CLAUDE.md§1.4 (“Examples of module locations”) to include a footnote that Excititor lives undersrc/Concelier/__Libraries/StellaOps.Excititor.*.
When to revisit
If/when any of the following occur, re-open the rename decision:
- Excititor begins shipping its own top-level service (WebService / Worker host) that is independently deployable from Concelier.
- A second cross-module rename of comparable scope ships successfully and establishes a repeatable migration playbook.
- CODEOWNERS / per-path access controls are introduced and the current layout actively blocks ownership boundaries.
Until any of those triggers fire, the cost-benefit favors retention.
