fix(identity): split Forgejo MCP identity per agent and disable admin MCP by default #56

Closed
opened 2026-05-04 17:36:27 +02:00 by Iskra · 2 comments
Collaborator

Context

Piotr reported a platform bug on Signal, 2026-05-04:

obecnie mcp używa mojego pdurlej chyba dla Forgejo, a powinno w zależności od modelu glm, codex lub claude. Każdy z agentów powinien widzieć tylko swoje MCP, a moje adminowe MCP powinno być wyłączone by default, ale w systemie.

This matches an existing identity-isolation smell noted in PR #42: Forgejo MCP/API path may still use the operator/admin identity while commits/worktrees were already separated by actor.

Bug

Forgejo MCP / platform MCP access appears to default to Piotr's admin identity (pdurlej) instead of the active agent identity.

Expected agent identities:

  • GLM runtime → glm Forgejo/MCP identity
  • Codex runtime → codex Forgejo/MCP identity
  • Claude runtime → claude Forgejo/MCP identity
  • Piotr/admin MCP → available only explicitly, disabled by default

Desired model

Each agent should see/use only its own MCP/tool identity by default.

Admin/operator MCP should exist in the system for explicit break-glass/admin work, but should not be exposed or selected by default in ordinary agent sessions.

Why it matters

This is an identity-boundary issue, not just cosmetics:

  • comments/issues/PR actions can be misattributed to Piotr;
  • agent accountability gets blurred;
  • reviewers cannot tell which model/agent performed an action;
  • admin token exposure surface is larger than needed;
  • it undermines the identity-isolation work from Order B/C.

Proposed fix direction

  1. Inventory current MCP definitions and Forgejo credentials.
  2. Identify which MCP server/tool path uses pdurlej by default.
  3. Split MCP config by actor/model/session where needed:
    • forgejo-glm
    • forgejo-codex
    • forgejo-claude
    • forgejo-admin / forgejo-pdurlej disabled by default.
  4. Ensure runtime model/agent selection resolves the corresponding MCP identity.
  5. Ensure admin MCP requires explicit opt-in / elevated operator path.
  6. Add identity doctor checks for MCP identity, not only git author/askpass.
  7. Add smoke test: each agent comments on a test issue as itself, not as pdurlej.

Acceptance criteria

  • Current Forgejo MCP identity leak/default is confirmed with evidence.
  • Actor-specific MCP configs exist or equivalent routing is implemented.
  • Ordinary GLM/Codex/Claude sessions do not see/use Piotr's admin MCP by default.
  • Admin MCP remains available only through explicit break-glass/admin path.
  • Identity doctor reports MCP identity per actor.
  • Test issue/comment proves attribution:
    • GLM action authored by glm;
    • Codex action authored by codex;
    • Claude action authored by claude;
    • no default action authored by pdurlej unless explicitly admin.
  • PR #8 — GLM comment hook / identity wiring
  • PR #12 — Codex askpass worktree wiring
  • PR #42 — STATE_OF_PLATFORM note: Forgejo MCP still using operator PAT for PR-create API
  • PLATFORM_CHARTER identity isolation rules
## Context Piotr reported a platform bug on Signal, 2026-05-04: > obecnie mcp używa mojego `pdurlej` chyba dla Forgejo, a powinno w zależności od modelu `glm`, `codex` lub `claude`. Każdy z agentów powinien widzieć tylko swoje MCP, a moje adminowe MCP powinno być wyłączone by default, ale w systemie. This matches an existing identity-isolation smell noted in PR #42: Forgejo MCP/API path may still use the operator/admin identity while commits/worktrees were already separated by actor. ## Bug Forgejo MCP / platform MCP access appears to default to Piotr's admin identity (`pdurlej`) instead of the active agent identity. Expected agent identities: - GLM runtime → `glm` Forgejo/MCP identity - Codex runtime → `codex` Forgejo/MCP identity - Claude runtime → `claude` Forgejo/MCP identity - Piotr/admin MCP → available only explicitly, disabled by default ## Desired model Each agent should see/use only its own MCP/tool identity by default. Admin/operator MCP should exist in the system for explicit break-glass/admin work, but should **not** be exposed or selected by default in ordinary agent sessions. ## Why it matters This is an identity-boundary issue, not just cosmetics: - comments/issues/PR actions can be misattributed to Piotr; - agent accountability gets blurred; - reviewers cannot tell which model/agent performed an action; - admin token exposure surface is larger than needed; - it undermines the identity-isolation work from Order B/C. ## Proposed fix direction 1. Inventory current MCP definitions and Forgejo credentials. 2. Identify which MCP server/tool path uses `pdurlej` by default. 3. Split MCP config by actor/model/session where needed: - `forgejo-glm` - `forgejo-codex` - `forgejo-claude` - `forgejo-admin` / `forgejo-pdurlej` disabled by default. 4. Ensure runtime model/agent selection resolves the corresponding MCP identity. 5. Ensure admin MCP requires explicit opt-in / elevated operator path. 6. Add identity doctor checks for MCP identity, not only git author/askpass. 7. Add smoke test: each agent comments on a test issue as itself, not as `pdurlej`. ## Acceptance criteria - Current Forgejo MCP identity leak/default is confirmed with evidence. - Actor-specific MCP configs exist or equivalent routing is implemented. - Ordinary GLM/Codex/Claude sessions do not see/use Piotr's admin MCP by default. - Admin MCP remains available only through explicit break-glass/admin path. - Identity doctor reports MCP identity per actor. - Test issue/comment proves attribution: - GLM action authored by `glm`; - Codex action authored by `codex`; - Claude action authored by `claude`; - no default action authored by `pdurlej` unless explicitly admin. ## Related - PR #8 — GLM comment hook / identity wiring - PR #12 — Codex askpass worktree wiring - PR #42 — STATE_OF_PLATFORM note: Forgejo MCP still using operator PAT for PR-create API - PLATFORM_CHARTER identity isolation rules
Collaborator

W4b reality check — PR opened — 2026-05-24

Role: executor
Intent: checkpoint
Needs owner: yes, via PR merge decision

Opened #439: docs(identity): document W4b Forgejo MCP reality.

Recommendation

Do not treat full MCP router implementation as a W4 blocker.

Current W4-safe standard is already documented and operational:

  • direct curl for Forgejo writes;
  • actor PAT from macOS Keychain;
  • verify /api/v1/user before writes;
  • inspect response user.login after writes;
  • do not use Forgejo MCP write tools when they authenticate as pdurlej.

How to interpret #56 after #439

  • W4 blocker: resolved by current standard + reality-check doc if #439 merges.
  • Future work: keep #56 open as Milestone 06 / agent-governance router work, or split it into smaller router/identity-doctor issues.
  • Do not close as fully fixed yet; the router itself is deferred, not implemented.

Runtime

None. Docs/spec only. No token movement, no MCP implementation, no runtime service.

## W4b reality check — PR opened — 2026-05-24 **Role:** executor **Intent:** checkpoint **Needs owner:** yes, via PR merge decision Opened #439: `docs(identity): document W4b Forgejo MCP reality`. ### Recommendation Do not treat full MCP router implementation as a W4 blocker. Current W4-safe standard is already documented and operational: - direct `curl` for Forgejo writes; - actor PAT from macOS Keychain; - verify `/api/v1/user` before writes; - inspect response `user.login` after writes; - do not use Forgejo MCP write tools when they authenticate as `pdurlej`. ### How to interpret #56 after #439 - W4 blocker: resolved by current standard + reality-check doc if #439 merges. - Future work: keep #56 open as Milestone 06 / agent-governance router work, or split it into smaller router/identity-doctor issues. - Do not close as fully fixed yet; the router itself is deferred, not implemented. ### Runtime None. Docs/spec only. No token movement, no MCP implementation, no runtime service.
Collaborator

W4b identity/MCP reality check has been consolidated into #443. If #443 merges, #56 is no longer a W4 blocker; remaining MCP router implementation should move/defer to Milestone 06 unless operator pulls it forward.

W4b identity/MCP reality check has been consolidated into #443. If #443 merges, #56 is no longer a W4 blocker; remaining MCP router implementation should move/defer to Milestone 06 unless operator pulls it forward.
Sign in to join this conversation.
No labels
W6d-automerge-calibration
agent/claude-code
agent/codex
agent/hermes
agent/iskra
agent/ollama
agent/patchwarden
automerge-candidate
class/security-sensitive
cutover-gate
dependency/blocked
dependency/blocks-others
dependency/cross-repo
dependency/needs-confirmation
domain:agents
domain:ci
domain:docs
domain:forgejo
domain:infra
domain:memory
domain:runtime
domain:signal
domain:ux
flow/architecture
flow/blocked
flow/deployed
flow/done
flow/implementation
flow/intake
flow/maintained
flow/observed
flow/ready
flow/refining
flow/retired
flow/review
iterating
judge/codex-candidate
judge/hermes-candidate
judge/low-confidence
judge/needs-refinement
judge/operator-needed
judge/p0
judge/p1
judge/p2
judge/p3
judge/park
judge/patchwarden-candidate
judge/stale-priority
kind/adr
kind/bug
kind/chore
kind/feature
kind/infra
kind/ops
kind/refactor
kind/research
large-impact
merge/auto
merge/manual
merge/manual-dependency-conflict
merge/manual-failing-tests
merge/manual-merge-conflict
merge/manual-missing-review
merge/manual-operator-preference
merge/manual-red-zone
merge/manual-security-sensitive
merge/manual-unclear-scope
merge/manual-unknown
meta
mode:operator-only
mode:patchwarden-iskra-approved
mode:safe-auto
needs-operator-decision
needs-triage
not-ready
observed/erroring
observed/needs-followup
observed/pending
observed/retire-candidate
observed/unused
observed/used
operator-emotional
owner-attention
phase/02
phase/03
priority:p0
priority:p1
priority:p2
priority:p3
proposed
ready-for-agent
ready-for-operator
recovery
review:claude-reviewed
review:codex-reviewed
review:dziadek-reviewed
review:needs-human
risk/exposure
risk/process
risk/product
risk/runtime
safety:external-write
safety:no-prod-mutation
safety:prod-impact
safety:secret-touch
size/large
size/medium
size/small
size/tiny
size/unknown
source/adr
source/agent-generated
source/manual
source/operator-chat
source/voice-note
status:blocked
status:codex-ready
status:merged:pending-evidence
status:needs-evidence
status:operator-needed
status:parked
tier/full
tier/lite
tier/stacked
tier:0-platform-substrate
tier:1-iskra-value-layer
tier:2-tools-products-modules
type:bug
type:chore
type:docs
type:feat
type:policy
type:research
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
pdurlej/platform#56
No description provided.