Skip to content

fix(helm): the MCP chart ran the pod as a user that owns none of its corpus - #425

Merged
beyondnetPeru merged 1 commit into
developfrom
fix/mcp-chart-runasuser
Aug 4, 2026
Merged

fix(helm): the MCP chart ran the pod as a user that owns none of its corpus#425
beyondnetPeru merged 1 commit into
developfrom
fix/mcp-chart-runasuser

Conversation

@beyondnetPeru

Copy link
Copy Markdown
Contributor

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 defect

src/packages/mcp-server/Dockerfile creates evolith at uid 1001, does 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 — which owns none of the corpus.

The symptom is remote from the cause, and total:

EACCES: permission denied, open '.../rulesets/opa/policy.wasm'

policy.wasm ships mode 600 owned by 1001. Dispatch requires both the native and OPA engines to allow; OPA erroring fail-closes. So every tools/call returned 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 by evolith.

Scope

Chart runAsUser Image uid
evolith-core-api 1001 1001
evolith-agent-runtime 1001 1001
evolith-mcp 1000 1001 ❌ this change

The 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.

Guard Result
ci-runner.mjs governance ✅ 17 scripts

Not in this change

The same robot run surfaced two more, both still to be run down:

  • /core/evaluate responds 201 with no gates.
  • /assistant/converse returns 502 on a 401 from the agent-runtime — a key mismatch in local wiring, not the product.

🤖 Generated with Claude Code

…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>
@beyondnetPeru
beyondnetPeru requested a review from a team as a code owner August 4, 2026 15:11
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@github-actions

github-actions Bot commented Aug 4, 2026

Copy link
Copy Markdown

📊 Bilingual Coverage Impact

PR Changes

  • Paired EN/ES files modified: 0
  • New EN files needing ES translation: 0

Repository Coverage

Metric Value
Total EN files 527
Total ES files 501
Paired files 0
Coverage 0%

Good: All EN changes have ES counterparts.


Generated by GitHub Actions

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant