Exploration done. Now resolving pinned versions for the images.Versions pinned. Now resolving base image digests.Digests pinned. Checking how crush matches filetypes to LSP servers (Dockerfile has no extension).Powernap internals can wait for empirical verification. Building the stack now.Now the compose file and wrappers.Marksman is F# (not Go) — prebuilt binary it is, per sibling pattern. Checking latest release + checksum.Marksman musl-x64 build (sha256-pinned) works on alpine without ICU. Fixing the Dockerfile.Direct build passes (checksum verified). Retrying compose build with full error capture.Compose parsed the date-like tag as a timestamp. Quoting fixes it.gopls v0.23.0 needs go ≥1.26. Switching base to golang:1.26-alpine.All 5 images built. Creating the network and smoke-testing each server with a raw LSP handshake.bash/yaml/dockerfile pass. Marksman returned nothing — debugging.Musl build still needs libstdc++/libgcc. Adding them.Marksman still silent; bash's initialize response missing. Testing raw byte capture per server.stdin EOF raced the servers. Retesting with held-open stdin and longer waits.All four aux servers pass. Now the critical one: gopls against the harness workspace.Direct run works — wrapper has a bug. Tracing it.Wrapper is fine — gopls cold start just exceeds the 3s test window. Retesting with longer wait.gopls via wrapper confirmed. Wiring crush config now — loading the jq skill for the JSON edit.Merged. Now the headless verification turn against a deliberately broken .go file in the harness project.Pipeline works — gopls container ran and returned a diagnostic. But the harness go.mod lacks a `module` line (stub), blocking semantic analysis. Checking the repo before fixing.gopls diagnostics fully verified. Now best-effort verification of the other four servers.yaml passes; bash/dockerfile need worse breakage; marksman didn't attach. Checking crush logs for marksman.No LSP logs at default level. Reading crush's manager to understand "no LSP client handles file".`lsp_symbols` with a relative path fails `HasPrefix` — likely an artifact of the agent passing a relative path. Retesting with absolute path.Enabling `debug_lsp` temporarily to see matching internals.Reference code says client should be registered pre-init. Testing whether a file *view* (not just lsp_symbols) triggers marksman start.Watching which containers actually spawn during a crush turn.Only bash spawned — marksman never attempted. Checking the installed binary's embedded LSP catalog.The KNEL sibling's proven config keys the entry as `markdown` with no filetypes (matches-all). Adopting that for marksman.Marksman verified (symbols returned, container spawned). Now explicit dockerfile verification with polling.dockerfile verified. Final bash check with a guaranteed parse error.Container starts but stays silent. Testing bash-ls directly with a full didOpen session.bash-ls logs the syntax error but doesn't publish it — likely needs `bashIde.sourceErrorDiagnostics`. Probing with the setting.Pipeline works (empty diagnostics published). One more content variant to catch a real bash diagnostic.bash-ls 5.6 upstream doesn't emit parse diagnostics (same as KNEL stack) — wired and responding regardless. Finalizing config, snippet sync, and cleanup.Parallel agent committed harness work mid-verification. Checking go.mod survived and re-verifying gopls on the now-real codebase.go.mod fix was absorbed into their commit. Final gopls proof against the real codebase.Definitive proof captured, file restored. Writing README and REPORT.Done. Stack lives in `~/projects/meta/MOPAC/lsp/`, report at `~/.coordinate/inbox-pmo/REPORT-lsp-stack.md`. - **Containers**: 5 servers built via compose (profile `build`), digest-pinned bases (golang:1.26-alpine, node:22-alpine, alpine:3.22), version-pinned installs, isolated `mopac-lsp` network, no ports (stdio), only workspace mounts + cache volumes. gopls mounts the go.mod root at its host path for URI parity. - **Wrappers**: KNEL `lsp-*-wrapper.sh` pattern, PID-suffixed container names for concurrent sessions, on-demand `docker run -i --rm`. - **Crush wiring**: `lsp` block merged into `~/.config/crush/crush.json` (snippet at `lsp/crush-lsp.json`); global, no per-project setup. Key gotchas: marksman must be keyed `markdown`; harness go.mod needed a `module` line (fixed, absorbed into the parallel session's commit). - **Proof (headless turns)**: gopls returned semantic errors on real harness code (`UndeclaredName`, `UnusedVar` at line:col); yaml, dockerfile (FRM), and marksman all returned live diagnostics/symbols. bash-ls is wired and publishing, but v5.6 upstream emits no parse diagnostics (documented). - marksman is F# not Go (task said Go) — handled via sha256-verified pinned musl release binary. Nothing committed (MOPAC root isn't a git repo); flagged in report for PMO to assign an owning repo.