--network=none + -p 8080:8080 is non-functional. CPU-only inference unvalidated. Dev paths leak in shipped config.The client workflow runs docker run --network=none ... -p 8080:8080 then says "open browser → localhost:8080." Port publishing does not function with --network=none. The entire UI layer (Components 5B, 8, 10) is dead as specified.
Recommended fix: Two-container compose design. engine service on an internal network writing state to a shared volume; a thin ui service published on 127.0.0.1:8080.
On macOS, Docker runs in a VM with no Metal passthrough. A 9B–14B model on CPU may run 5–10× slower. If 500 controls takes 40+ hours, the architecture pivots.
Action: Run the CPU-only benchmark this week.
Docker Desktop requires a paid subscription for organizations over 250 employees or $10M revenue. Every bank in the target segment exceeds the revenue threshold.
db_path: ~/AI/memory/databases/canonical/context.db, personal output paths. Shipped defaults must be container paths. Both a functional bug and an information-leak issue.
Container limit exceeds host minimum. A client passing the readiness gate can OOM overnight.
API_KEY = os.environ.get("CRI_MCP_API_KEY", "") — never referenced again. No auth middleware. Unauthenticated request returned HTTP 200 with full server handshake.
Fix: Wire into FastMCP 3.x auth providers. One day of work.
Docker binds 0.0.0.0:8443. Direct HTTP returned 200 unauthenticated, bypassing nginx/TLS entirely.
Fix: Bind to 127.0.0.1:8443 or close in security group.
limit_req at nginxlist_available → list_decompositionsget_decomposition / get_control_characteristics overlapget_manifest() discovery toolvalidate_selection sends client metadata server-sideRight tool count: 9→11, not a rewrite.