fix(helm): the MCP chart ran the pod as a user that owns none of its corpus - #425
Merged
Conversation
…corpus
`src/packages/mcp-server/Dockerfile` creates `evolith` at uid 1001,
`chown -R evolith:evolith /repo /app`, and declares `USER evolith`. The
chart pinned `runAsUser: 1000`, which overrides the image's USER and
lands the process on the base image's `node` user.
The symptom is remote from the cause and total. `policy.wasm` ships mode
600 owned by 1001, so at uid 1000 the OPA engine gets
EACCES: permission denied, open '.../rulesets/opa/policy.wasm'
and dispatch requires BOTH the native and OPA engines to allow. OPA
erroring fail-closes, so EVERY `tools/call` returns FORBIDDEN: a deployed
MCP server that advertises 51 tools and can execute none.
Found by running the `core-integration` robot against a live two-cluster
stack for the first time — it is excluded from the default RoboSoft list
and had never executed. The pod reported `uid=1000(node)` while the file
it could not open was owned by `evolith`.
`evolith-core-api` and `evolith-agent-runtime` already pin 1001; this
chart was the odd one out, which is why only the MCP surface failed.
Verified on the live cluster after the change: the pod reports
`uid=1001(evolith)` and the wasm is readable.
Not in this change, and separate: the same robot found `/core/evaluate`
returning 201 with no gates, and `/assistant/converse` 502 on a 401 from
the agent-runtime (a key mismatch in my local wiring, not the product).
Both still to be run down.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
📊 Bilingual Coverage ImpactPR Changes
Repository Coverage
✅ Good: All EN changes have ES counterparts. Generated by GitHub Actions |
This was referenced Aug 4, 2026
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Found by running the
core-integrationrobot against a live two-cluster stack for the first time — it is excluded from the default RoboSoft list and had never executed.The defect
src/packages/mcp-server/Dockerfilecreatesevolithat uid 1001, doeschown -R evolith:evolith /repo /app, and declaresUSER evolith. The chart pinnedrunAsUser: 1000, which overrides the image's USER and lands the process on the base image'snodeuser — which owns none of the corpus.The symptom is remote from the cause, and total:
policy.wasmships mode600owned by 1001. Dispatch requires both the native and OPA engines to allow; OPA erroring fail-closes. So everytools/callreturned FORBIDDEN — a deployed MCP server that advertises 51 tools and can execute none.The live pod reported
uid=1000(node)while the file it could not open was owned byevolith.Scope
runAsUserevolith-core-apievolith-agent-runtimeevolith-mcpThe MCP chart was the odd one out, which is why only that surface failed.
Verification
On the live cluster after the change: the pod reports
uid=1001(evolith)and the wasm is readable.ci-runner.mjs governanceNot in this change
The same robot run surfaced two more, both still to be run down:
/core/evaluateresponds 201 with no gates./assistant/conversereturns 502 on a 401 from the agent-runtime — a key mismatch in local wiring, not the product.🤖 Generated with Claude Code