Files
ScadaBridge/docs/plans/2026-05-31-folder-repo-rename-scadabridge-design.md
T

9.7 KiB

Folder + Repo Rename scadalink-designScadaBridge — Design

Date: 2026-05-31 Status: Approved, ready for implementation planning Scope: Rename the repo folder ~/Desktop/scadalink-design~/Desktop/ScadaBridge, rename the Gitea repository dohertj2/scadalink-designdohertj2/ScadaBridge, and scrub every residual scadalink/ScadaLink reference inside the repo to its ScadaBridge equivalent.

This reverses the earlier decision (in 2026-05-28-scadabridge-rename-design.md) to leave the folder name diverged from the product name, and completes the residual reference scrub that the earlier effort deliberately left out (the SCADALINK_* runtime env vars and the production deploy script).

Context

The product was already renamed from "ScadaLink" to "ScadaBridge" in the 2026-05-28 effort: the solution (ZB.MOM.WW.ScadaBridge.slnx), all src//tests/ projects, namespaces, MS SQL databases, docker containers/network/image, the CLI config dir (~/.scadabridge/), CLAUDE.md, and README.md already say ScadaBridge. What remained untouched were the runtime environment variables (SCADALINK_*), one .NET config-key convention (ScadaLink__*), a stale assembly-name reference in the production deploy script, a few cosmetic identifiers, and historical doc/code-review mentions.

Decisions

# Decision Selected option
1 Folder-name collision (~/Desktop/ScadaBridge already exists — a separate, older, non-git project) Rename the existing folder aside to ~/Desktop/ScadaBridge-old (non-destructive); nothing deleted
2 Reference scope Full scrub — env vars, config keys, assembly name, SQL login, cosmetic identifiers, and historical docs/code-reviews
3 Env-var cutover style Hard cutover (no backward-compat fallback); dev stack is redeployed
4 New env-var/identifier prefix Short product name SCADABRIDGE_ / ScadaBridge__ (no ZB.MOM.WW), consistent with existing runtime artifacts (scadabridge-* containers, ~/.scadabridge/)
5 Gitea server-side rename User renames via the Gitea web UI; Claude updates the local origin remote and verifies
6 Execution mechanism Scripted multi-pass sed over git ls-files, most-specific-first, with a completeness-gate git grep
7 Migration records Carved out of the scrub so their before→after meaning survives (see §2)

Section 1 — Order of operations

  1. Safety check — confirm the working tree is clean (commit/stash WIP first); record the current branch.
  2. Clear the collisionmv ~/Desktop/ScadaBridge ~/Desktop/ScadaBridge-old.
  3. Move the foldermv ~/Desktop/scadalink-design ~/Desktop/ScadaBridge. Plain OS move; git tracks contents, not the repo-root directory name, so history is untouched. .idea/ and .claude/ ride along inside the moved folder.
  4. Scrub references — run the scripted multi-pass sed (§2).
  5. Build + test gatedotnet build ZB.MOM.WW.ScadaBridge.slnx, unit tests, completeness git grep.
  6. Commit (§5).
  7. Runtime cutover — rebuild + redeploy docker so running containers read the new env-var names (§4). No DB changes.
  8. Gitea rename — user web-UI rename; Claude updates local origin + verifies fetch/push.
  9. Write/commit this design doc (already produced by the brainstorm).

Section 2 — The scrub

A new tools/scrub-scadalink-refs.sh operating on git ls-files -z | xargs -0 sed -i '' (skips .git/ and bin/obj build artifacts), applied most-specific-first so a broad rule cannot double-replace an earlier result:

1. ScadaLink.Host.exe   → ZB.MOM.WW.ScadaBridge.Host.exe   (stale assembly name, deploy/install.ps1)
2. ScadaLink__          → ScadaBridge__                    (.NET hierarchical config keys, deploy/install.ps1)
3. SCADALINK_           → SCADABRIDGE_                      (13 runtime env vars)
4. scadaLinkVersion     → scadaBridgeVersion               (Transport param/local var — cosmetic)
5. scadalink_app        → scadabridge_app                  (SQL login)
6. ScadaLink            → ScadaBridge                      (residual)
7. scadalink            → scadabridge                      (residual)

SCADALINK_CONFIG, SCADALINK_FORMAT, SCADALINK_USERNAME, SCADALINK_PASSWORD, SCADALINK_MANAGEMENT_URL, SCADALINK_CONFIGURATIONDB_CONNECTION_STRING, SCADALINK_DESIGNTIME_CONNECTIONSTRING, SCADALINK_MSSQL_TEST_CONN, SCADALINK_PLAYWRIGHT_DB, SCADALINK_JWT_SIGNING_KEY, SCADALINK_LDAP_SERVICE_ACCOUNT_PASSWORD, SCADALINK_AUDIT_FILTER_4KB_P95_US, SCADALINK_AUDIT_FILTER_RAW_P95_US.

They are read by code (Environment.GetEnvironmentVariable(...) in Host/CLI/tests) and set by docker/docker-compose.yml, docker-env2/docker-compose.yml, appsettings.Central.json (${...} placeholders), and deploy/wonder-app-vd03/install.ps1. All sites change together in one pass.

Carved out (excluded — migration records)

Scrubbing these would destroy their before→after meaning:

  • tools/rename-to-scadabridge.sh — prior rename tooling.
  • tools/scrub-scadalink-refs.sh — this scrub script (its substitution rules are the mapping).
  • docker/rename-databases.sh — DB rename helper (ALTER DATABASE ScadaLinkConfig MODIFY NAME = ScadaBridgeConfig, ALTER LOGIN [scadalink_app] ...).
  • docs/plans/2026-05-28-scadabridge-rename-design.md — prior rename design.
  • docs/plans/2026-05-31-folder-repo-rename-scadabridge-design.mdthis document (also a before→after record).
  • docs/plans/2026-05-31-folder-repo-rename-scadabridge-plan.md — the implementation plan (its substitution table and embedded script are the mapping).

Completeness gate

Must return only the six carve-outs:

git grep -niE "scadalink" -- . \
  ':!tools/rename-to-scadabridge.sh' \
  ':!tools/scrub-scadalink-refs.sh' \
  ':!docker/rename-databases.sh' \
  ':!docs/plans/2026-05-28-scadabridge-rename-design.md' \
  ':!docs/plans/2026-05-31-folder-repo-rename-scadabridge-design.md' \
  ':!docs/plans/2026-05-31-folder-repo-rename-scadabridge-plan.md'

Section 3 — Collision folder

The existing ~/Desktop/ScadaBridge (non-git, older project containing akka.md, netstd.md, CommentChecker, its own src//tests//tsdb/) is renamed to ~/Desktop/ScadaBridge-old. Nothing is deleted. If the user later confirms it is dead, they delete it themselves.

Section 3a — Git-ignored deploy/ tree (added during implementation)

/deploy/ is git-ignored, so the git grep-based scrub script (and its completeness gate) structurally could not reach it — a gap surfaced by code review. The deploy/wonder-app-vd03/ production artifacts (install.ps1, appsettings.Central.json, appsettings.Site.json, RUNBOOK.md, ldap/glauth.cfg) still held old references that would break against the renamed binary: SCADALINK_* env vars, ScadaLink__* config keys, the "ScadaLink" config-section root, ScadaLink.Host.exe (now ZB.MOM.WW.ScadaBridge.Host.exe), scadalink.exe (CLI AssemblyName is scadabridge), and akka.tcp://scadalink@… seed URIs (the actor system name in code is scadabridge).

Per user decision, this tree was scrubbed by hand with the same substitution set, including the internal LDAP directory domain (dc=scadalink,dc=localdc=scadabridge,dc=local and @scadalink.local@scadabridge.local) applied in lockstep across both appsettings and glauth.cfg so LDAP login stays consistent. Because deploy/ is git-ignored, these edits are local-only / not committed — they fix the on-disk artifacts for the next wonder-app-vd03 deploy. Verified clean with grep -rniI scadalink deploy/.

Section 4 — Runtime cutover

Hard cutover. After the scrub, rebuild the image and docker compose up -d --force-recreate on both clusters (docker/, docker-env2/) so the running containers read SCADABRIDGE_*. No database rename or wipe — database names were already migrated in the 2026-05-28 effort and are unchanged here. If no stack is currently running, the cutover applies on the next bash docker/deploy.sh.

Section 5 — Commits

Two staged commits on the current branch, git diff-reviewed between them:

  1. refactor: scrub residual ScadaLink refs → ScadaBridge (env vars, config keys, assembly name, SQL login) — the scrub + any build/test fixes.
  2. docs: add folder/repo rename design doc — this document.

The folder mv and the Gitea rename are not git commits.

Section 6 — Risks & rollback

  • Missed env var → silent config-read failure. Mitigated by the completeness-gate grep + build/test + redeploy smoke check.
  • Folder move breaks editor/Claude session paths — the concern that drove the 2026-05-28 "don't rename the folder" decision; accepted by the user this time.
  • Gitea redirect — Gitea auto-redirects the old repo URL after rename, so pushes do not hard-fail even before the remote is updated; origin is updated regardless.
  • Rollback — pre-scrub state is the last git commit (git reset --hard); folder moves reverse with mv.

Section 7 — Verification

  • dotnet build ZB.MOM.WW.ScadaBridge.slnx clean; unit tests green.
  • Completeness grep returns only the four carve-outs.
  • git remote -v shows https://gitea.dohertylan.com/dohertj2/ScadaBridge.git; git ls-remote origin / git fetch succeeds.
  • (If a stack is running) CLI smoke against the redeployed cluster.

Out of scope

  • Renaming the MS SQL databases, docker containers/network, or CLI config dir — already done in the 2026-05-28 effort.
  • Sister repos ~/Desktop/MxAccessGateway, ~/Desktop/OtOpcUa.
  • Deleting ~/Desktop/ScadaBridge-old — left to the user.