# Location-independent workspace discovery Decided 2026-08-09. The safety runner located the CMS and orchestrator through hard-coded `$HOME/src/blockninja` paths and compared repositories as raw absolute strings. The shared workspace can also be mounted at paths such as `/srv/agent-work/blockninja`. Even when both paths address the same files, the string mismatch caused an explicit orchestrator scan to be classified as CMS; the CMS protobuf namespace filter then removed every orchestrator RPC. ## Decision - Discover the consolidated workspace by walking upward from the current directory, executable directory, and compiled source location. - Recognize a workspace only when the independent `cms`, `orchestrator`, and `check-safety` Go modules are present. - Retain `$HOME/src/blockninja` only as the final compatibility fallback for an installed binary launched outside the workspace. - Compare existing paths with filesystem identity and resolved symlinks before falling back to cleaned absolute strings. - Cover non-home workspaces and aliased paths with regression tests. - Reconcile the registry assertion, golden snapshots, and check catalog with the already-shipped 34th schema-purity check so the runner's own suite is a reliable validation gate again. - Remove the obsolete core-SDK version helper left behind when check 2c moved to the published plugin SDK, restoring strict unused-code linting. ## Consequences - `check-safety ../orchestrator` selects the `orchestrator.*` RPC namespace from any consolidated workspace location. - Default CMS scans and `--orchestrator` resolve siblings from the active checkout instead of silently crossing into another checkout. - Symlink, bind-mount, and alternate mount-path aliases are treated as the same repository when the operating system reports the same underlying directory. Keywords: check-safety, workspace discovery, /srv/agent-work, $HOME/src/blockninja, orchestrator, CMS, RPC namespace, samePath, symlink, bind mount