docs(session-mcp-tool-surface): kubectl 을 걷은 근거를 「이 표면에 두지 않는 것」에 세운다 (기각) - #136
Merged
dlddu-k3s-homelab-k3s-mcp[bot] merged 1 commit intoSep 13, 2026
Conversation
… (기각) #134 는 등재 4번 `kubectl` 을 걷으면서 근거를 적지 않았고, 그 사실을 문서 머리에 현재형으로 남겨 두었다 — 「걷은 근거는 아직 이 문서에 없다 … 그 판정이 서면 해당 절에 한 줄로 들어갈 자리다」. 그 판정을 세운다: **기각**이다. 판정 항목의 제목은 개별 도구가 아니라 기준으로 지었다 — 「게이트 밖에 남는 권한을 요구하는 도구」. 호출 하나하나가 승인을 지나도, 그 도구를 쓸모 있게 만들려고 넓힌 상시 권한은 승인이 회수하지 못한다. `kubectl` 이 그 기준에 걸리는 근거(전부 실측): - 자리 자체는 맞았다 — 워크로드 파드는 SA 토큰이 있으나 AC-F2 egress 가 API 서버 경로를 끊고, 헬퍼 파드는 길은 있으나 ServiceAccount 가 없다(`helperPodSpec`). - `data-plane` SA 는 `view` + 노드 읽기뿐이라(`k8s/data-plane-rbac.yaml`) `apply`·`exec` 가 애초에 안 된다. 조회 쪽은 등재 2번이 좁은 승인 컨텍스트로 내므로 `kubectl` 의 고유분은 정확히 그 RBAC 확대분이다. - 그 SA 는 타입 공통 워크로드 파드 스펙이 자동 마운트하는데 egress 정책·승인 게이트는 approval-gated 분기에서만 붙는다 — 넓힌 권한이 게이트 없는 `shell`·`claude-code` 에 그대로 열린다. - 전용 자격 증명으로 그 누출을 피해도 신원이 앉을 자리는 외부 Secret 둘을 이미 든 헬퍼 파드다(AC-F6). 재진입 조건도 함께 적었다(수요가 서면 먼저 2번의 범위 확장 → 부족하면 이 판정을 뒤집는다) — R10 의 사설 CA 자리와 같은 형태다. 문서 1파일 · 코드 0줄. 등재 목록 불변(roadmap:4) · 도구 표면 불변(tools:1) · 정적 게이트 4종 출력 base 와 바이트 동일. Reconciliation task: rct_20260913-0001 (tbm_session-platform-mcp-tool-roadmap)
dlddu-k3s-homelab-k3s-mcp
Bot
deleted the
reconcile/rct_20260913-0001-mcp-tool-roadmap
branch
September 13, 2026 13:22
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.
무엇이 비어 있었나
#134가 등재 4번
kubectl을 걷으면서 걷은 근거를 적지 않았다. 그 PR은 그 공백을 숨기지 않고 문서 머리에 현재형으로 남겼다:이 문서를 to-be로 갖는 모델은 철회를 「⑵ 근거와 함께 등재에서 철회」로만 인정하고, 그 정의가 「철회라면 근거를 「이 표면에 두지 않는 것」 절에 남긴다」로 자리까지 지정한다. 그 판정을 세운다.
###헤딩 목록만 읽는데, 근거 한 줄은 다른 절에 들어가므로 그것을 적어도roadmap:4는 한 글자도 움직이지 않는다.kubectl은 이미 목록 밖이라 이 축을 다시 깨울 버전 이동도 없다 — 지금 잡지 않으면 영영 보이지 않는다.판정: 기각(미룸이 아니다)
항목 제목을 개별 도구가 아니라 기준으로 지었다 — 「게이트 밖에 남는 권한을 요구하는 도구」. 호출 하나하나가 승인을 지나도, 그 도구를 쓸모 있게 만들려고 넓힌 상시 권한은 승인이 회수하지 못한다. 넓히는 그 권한이 곧 도구의 고유 가치인 항목은 이 표면에 두지 않는다.
kubectl이 그 기준에 걸리는 근거는 전부 이 레포에서 실측했다.data-planeSA 토큰을 갖지만 AC-F2의 egress 허용 목록(kube-dns·자기 헬퍼)이 API 서버로 가는 길을 끊고, 헬퍼 파드는 길은 있으나 Kubernetes 신원이 없다helperPodSpec은ServiceAccountName을 주지 않고 automount를 끈다. 그 코드 주석이 이유를 **「nothing in it needs the API server, and the pod holds both of the platform's external secrets」**로 적는다kubectl의 고유분 = RBAC 확대분 — 그 SA가 갖는 것은view+ 노드 읽기뿐이라apply·exec가 애초에 되지 않는다. 조회 쪽은 등재 2번(K3s MCP 재노출)이 도구별로 좁은 승인 컨텍스트에 실어 내므로(R4상 그쪽이 낫다는 것은 등재 당시 이미 적혀 있었다), 남는 고유분이 정확히 「되게 하려고 넓히는 권한」이다k8s/data-plane-rbac.yaml(view+…-node-reader; 그 파일 주석이 「RBAC은 additive라 Secrets를 뺀 와일드카드를 안전하게 표현할 수 없다」고 적는다)approval-gated전용이 아니다 — 워크로드 파드 스펙은 타입 공통이고ServiceAccountName=data-plane· automounttrue인데, NetworkPolicy 2종과 승인 게이트는workloadType == approval-gated분기 안에서만 붙는다. 게이트 뒤에 도구 하나를 세우려고 넓힌 권한이, 게이트도 egress 정책도 없는shell·claude-code워크로드 파드에 그대로 열린다client_orchestrator.go— 워크로드 파드 스펙(타입 공통) vsapplySessionNetworkPolicies호출 위치미룸이 아니라 기각인 이유는 ⑶·⑷다 — 선행(R9 + AC-F4 개정)을 하나 더 치르면 열리는 문이 아니라, 치르고도 승인이 통제하지 못하는 권한이 남는다. 등재 당시 적혀 있던 「넓힌 권한은 게이트가 거절해도 남는다」의 실체가 이것이고, #134가 걷은 판단은 옳았다.
영구 봉인이 아니다 — 재진입 조건
이 문서의 선례를 그대로 썼다. R10의 사설 CA 자리가 「수요 0이라 반려됐다(2026-09-07) … 그 판정을 먼저 뒤집어야 한다」로 서 있다. 같은 형태로:
그리고 새 기준이 등재 2번을 잘못 잡지 않도록 비적용 단서를 함께 뒀다 — 2번이 요구하는 토큰의 힘은 게이트를 지나는 도구 밖에서 행사되지 않고, 이미 다른 파드가 들고 있는 권한을 넓히지도 않는다.
변경
docs/session-mcp-tool-surface.md한 파일, +20/−2.2026-09-13 (2)라벨을 이미 쓰고 있어 새로 만들면 번호가 충돌하고, 이 변경은 그 항목이 스스로 비워 둔 자리를 채우는 것이라 같은 항목 안이 제자리다(선례: #134가2026-09-12 (2)항목의 낡은 「1~4」를 같은 방식으로 고쳤다).코드 0줄 ·
docs/index.html0줄(메타 「도구 추가 규칙 12 · 다음 구현 대상 4」는 이 변경으로 움직이지 않는다).불변 증명
base
69ff764와 이 브랜치에서 각각 돌려 출력이 바이트 동일함을cmp로 확인했다.roadmap:4 0. ping|1. git_clone|2. K3s MCP 재노출|3. gh CLI— 불변tools:1 web_fetch_get— 불변scripts/check_comment_policy.pyscripts/check-fidelity-allowlist.pyscripts/check-render-fidelity.pyscripts/e2e/check-scenario-mapping.sh두 버전이 다 불변인 것이 이 task의 정상 상태다 — 완료 기준을 버전 이동으로 잡지 않았다. 애초에 그 축에 재감지 경로가 없다는 것이 이 task가 열린 이유다.
충돌면 — #135와 두 자리
열린 PR 여섯(#106 · #127 · #130 · #131 · #133 · #135) 중 이 파일을 건드리는 것은 #135 하나다. 겹치는 자리 둘 다 산문이고 해소가 기계적이다.
…자리다)*.줄을…자리다) ·로 바꾸고2026-09-13 (2)항목을 잇는다. 이 PR은 그 두 줄을 정정한다. → 해소: 정정된 문장을 살리고 그 뒤에 #135의(2)항목을 잇는다(기각으로 섰다 — 뒤로 미룬 것이 아니라는 판정까지 그 항목이 갖는다) ·+ #135의 블록).ping」으로 바꾸고, 이 PR은 네 번째 항목을 끝에 더한다. 서로 다른 항목이라 양쪽을 그대로 두면 된다.범위 밖 (후속)
ping착지 — 자매rct_20260912-0001/ #135가 들고 있다.docs/doc-tracker.md행 없음 — 선례 docs(session-mcp-tool-surface): 진단 도구 ping 을 0번으로 등재한다 (구현 대상 4→5) #128·docs(session-mcp-tool-surface): kubectl 을 구현 대상에서 걷는다 (구현 대상 5→4) #134 둘 다 등재 변경에 원장 행을 두지 않았다. 걷힌 항목이 들고 있던 관측은 그 원장의2026-09-08 (2)행에 history로 남아 있고, 이 PR은 그중 판정에 쓰이는 것만 살아 있는 절로 옮겼다.🤖 Generated with Claude Code