Skip to content

feat: K8s NodeGroup 스케일링 화면 통합, 클러스터 생성 버전 입력 허용, Remote Command 대상 파라미터 정정 - #104

Merged
MZC-CSC merged 20 commits into
m-cmp:mainfrom
MZC-CSC:develop
Sep 19, 2026
Merged

MZC-CSC merged 20 commits into
m-cmp:mainfrom
MZC-CSC:develop

Conversation

@MZC-CSC

@MZC-CSC MZC-CSC commented Sep 19, 2026

Copy link
Copy Markdown
Member

Summary

The same user action behaved differently per CSP on the K8s (PMK) screens. In most cases the console was exposing CB-Spider driver differences directly to the user. This PR changes that: the screen is now identical regardless of CSP, and the per-CSP differences are translated into the right call sequence underneath.

It also fixes the Remote Command / File Transfer target parameters and the missing Tencent root disk types.

The work was verified against live resources on AWS, Azure, GCP, Alibaba, Tencent, NCP, NHN and IBM. What each driver actually does is recorded in code comments as the basis for the translation table.


1. K8s NodeGroup scaling — two actions merged into one

Before: Set Autoscaling (on/off) and Change Autoscale Size (desired/min/max) were separate menus. The two values depend on each other but were saved separately, so the wrong order was either rejected by the CSP or silently ignored.

After: one Edit Scaling dialog. The user enters the same thing on every CSP.

User input Meaning
Autoscaling Off + Desired Pin the node count to that number
Autoscaling On + Desired/Min/Max Scale automatically between min and max

The same input is translated into different calls per CSP. For example, "switch autoscaling off and pin to 3 nodes":

  • AWS, NCP: Change(3,3,3) — neither CSP has a working off switch, so the range is pinned to produce the same result
  • Azure: Set(off) → Change(3,0,0) — a manual-mode Change only accepts min=max=0
  • GCP, Tencent, Alibaba, NHN: Change(3,3,3) → wait → Set(off)
  • IBM: Change(3,3,3) → Set(off) (no wait — the autoscaler ConfigMap is applied immediately)

The translation lives in one place, front/assets/js/common/utils/k8sScalingRules.js, declared as driver facts (changeAppliesDesired, changeForcesEnable, set, offMode, enableOrder, waitBetween, clampsRangeToNodeCount). Plan building has no per-CSP branching. When a driver is improved, only the corresponding flag needs to change.

A multi-step executor (k8sScalingQueue.js) was added:

  • It waits between steps until the CSP state settles. A 200 OK does not mean the change has been applied — on Azure the nodepool operation starts about 7 seconds after the response.
  • The wait is judged on the CSP-native status reported by CB-Spider. NHN reports Active upstream while the node group is still UPDATE_IN_PROGRESS, and autoscale calls are rejected with 400 during that window.
  • A Set call is skipped when the node group is already in that state. Azure returns an error if Set repeats the current state, and on CSPs where Change also flips the mode, the trailing Set is unnecessary.
  • Work in progress is stored in the session, so leaving and returning to the page resumes it.

2. K8s cluster creation — allow a version outside the list

The version dropdown only offered what GET /availableK8sVersion returned. That list is a static file in CB-Tumblebug (assets/k8sclusterinfo.yaml), so it drifts as soon as a CSP bumps a patch version. On Alibaba all five entries were invalid, and no selectable value could create a cluster:

InvalidKubernetesVersion: The specified KubernetesVersion 1.35.2-aliyun.1 is invalid,
allowd values are [1.36.2-aliyun.1 1.35.7-aliyun.1 1.34.10-aliyun.1]
  • The Version field changed from select to input + datalist, so the retrieved list stays as suggestions while a value can also be typed in.
  • skipVersionCheck=true is attached only when the entered value is outside the list. Values picked from the list never carry it — attaching it unconditionally would remove the typo guard on every CSP.
  • When creation fails, the list of versions the CSP reports as allowed is parsed out and shown to the user.

Verified on live Alibaba resources: entering 1.35.7-aliyun.1 (outside the list) created a cluster that reached Active.

3. K8s creation form fixes

  • Deploying an Expert creation without adding a NodeGroup sent no request but showed a success toast. Fixed.
  • CSPs that cannot accept node groups in the cluster creation request (AWS, Alibaba, Tencent) now hide that section and state why.
  • Numeric fields in the Add NodeGroup request are sent as the integer types CB-Tumblebug expects (they were sent as strings and rejected with 400).
  • Fixed NCP Simple creation always failing. Sending {on:false, min:0, max:0} made CB-Tumblebug inject min→1, max→2, which the NCP driver then rejected with "If MinNodeSize is specified, OnAutoScaling must be enabled."
  • Fixed NHN Add NodeGroup being rejected when max_node_count was 0.

4. Remote Command / File Transfer

  • Corrected the target query parameters from subGroupId/vmId to nodeGroupId/nodeId. The old names were left over from the terminology change and broke target selection.
  • Cancelling the confirmation modal no longer discards the input form.
  • Added the 10 MB file transfer limit on the server side as well. CB-Tumblebug rejects larger payloads, so the request is now stopped before the multipart body is built and the reason is returned.

5. Tencent root disk types

Current-generation instances (S8 and similar) only support CLOUD_BSSD and CLOUD_HSSD as system disks. They were missing from the list, so node creation kept being rejected with the default CLOUD_PREMIUM. Both types were added (CLOUD_TSSD is excluded — it cannot be a system disk).


Verification

  • 47 browser E2E regression cases passed, covering the scaling actions across all eight CSPs
  • Live resources: cluster creation, Add NodeGroup, and scaling on/off on AWS, Azure, GCP, Tencent, NCP, NHN, IBM and Alibaba
  • Results were judged on what CB-Tumblebug reports (the CB-Spider native values) and the actual node count, not on the UI toast

Known limitations (worked around in the console)

These need driver-side improvements. The console works around them so that the user's action still ends up doing what was intended; once a driver is fixed, only the corresponding flag in the rules table has to change.

CSP Issue
NCP SetNodeGroupAutoScaling is a return false, nil stub, so switching off does nothing
Alibaba ChangeNodeGroupScaling forces autoscaling on and never passes the desired count (cb-spider#1842, PR #1844 in progress)
NHN ChangeNodeGroupScaling does not pass the desired count and widens the range to fit the running nodes
IBM ChangeNodeGroupScaling only writes min/max into the autoscaler ConfigMap
GCP SetNodeGroupAutoScaling(on) is not supported (cb-spider#1329)
Azure Set returns an error when it repeats the current state
CB-Tumblebug The K8s version list is a static file and does not follow CSP patch versions

yh-noh and others added 20 commits September 14, 2026 15:55
CSP마다 cb-spider 드라이버 동작이 크게 달라 같은 폼·같은 payload로는
의도한 결과가 나오지 않았다. 사용자는 CSP와 무관하게 같은 폼을 쓰고
프론트가 CSP별로 통하는 payload와 호출 순서로 번역하도록 바꾼다.

- common/utils/k8sScalingRules.js 신설: CSP별 규칙·안내문구를 데이터로 두고
  생성 payload(buildCreateScaling), 수정 계획(buildModifyPlan),
  읽기(readBackScaling), 검증(validateScalingForm)을 순수 함수로 제공
- common/api/k8sScalingQueue.js 신설: 다단계 작업을 sessionStorage 큐에 쌓고
  모든 페이지에서 재개한다. 화면을 벗어나도 남은 호출이 유실되지 않는다
- NodeGroup 액션의 Set Autoscaling / Change Autoscale Size 두 메뉴를
  Edit Scaling 하나로 합치고, 계획 미리보기와 백그라운드 실행을 붙였다
- 체크박스 해제는 "고정 크기"를 뜻한다. 진짜 off를 지원하는 CSP는 off로,
  아닌 CSP는 min=max=desired로 고정해 같은 결과를 만든다
- 생성 3경로(Expert/Add/Simple)도 같은 폼 순서로 재배치하고 규칙 모듈을 태운다
- k8s_api.js: intOr 도입으로 0을 1로 바꾸던 강제 치환 제거.
  Azure 수동 모드의 min=max=0 전송이 이 수정에 달려 있다
- deployPmkDynamic이 읽지 않던 desiredNodeSize를 전송하도록 수정
- NodeGroup List의 중복 메뉴 New 제거 (Add NodeGroup 버튼과 같은 기능)

대기 조건은 값뿐 아니라 NodeGroup Status까지 본다. cb-spider는 agentPool
스펙이 바뀌는 즉시 OnAutoScaling을 뒤집어 보고하지만 Azure의 nodepool
operation은 그 뒤에 시작되므로, 값만 보고 다음 호출을 보내면 Azure가
409 OperationNotAllowed(AnotherOperationInProgress)로 거부한다.
feat(k8s): NodeGroup 스케일 폼을 Desired + Autoscaling 체크박스로 개편
…EB-BUG-100, WEB-BUG-101)

WEB-BUG-100
AWS·Alibaba·Tencent 는 생성 시점에 NodeGroup 을 받지 않아 Expert 폼에서
NodeGroup 영역이 숨는다. 그러면 Create_Cluster_Config_Arr 가 빈 채로 남는데
CreateCluster 가 [0].k8sNodeGroupList 에 가드 없이 접근해 TypeError 가 났고,
호출부가 await 하지 않아 요청이 나가지 않았는데도 성공 토스트가 떴다.

- CreateCluster: 빈 배열이면 NodeGroup 없이 요청을 만든다
- createCluster: 요청 생성을 await 하고, 실패하면 실패 토스트를 띄운다
- 생성 시점에 NodeGroup 이 필요한 CSP(Azure·GCP·NCP·NHN·IBM)는 NodeGroup 없이
  Deploy 하면 tumblebug 이 거부하므로 요청 전에 모달로 알린다

WEB-BUG-101
NodeGroup 을 받지 않는 CSP 를 고를 때 남긴 인라인 display:none 이, 다른 CSP 로
바꾼 뒤에도 .active 클래스를 이겨 NodeGroup 폼과 Add NodeGroup 폼이 열리지 않았다.
영역을 다시 보일 때 인라인 스타일을 걷어낸다.
NodeGroup 생성 큐는 받은 config 를 그대로 request 로 보내는데, 큐로 옮기면서
buildNodeGroupRequest 를 거치던 정규화가 빠졌다. 폼 값이 문자열이라 rootDiskSize 가
""로 나가 tumblebug 이 "Unmarshal type error: expected=int, got=string,
field=rootDiskSize" 로 거부했다. GCP 는 별도 전송 경로라 영향이 없었고 나머지 CSP 의
Add NodeGroup(폼·JSON Import)이 모두 실패했다.

큐에 넣기 전에 buildNodeGroupRequest 로 타입을 맞춘다. 값(0 포함)은 그대로 두므로
CSP 별 autoscale 번역 결과는 유지되고, 빈 루트 디스크 크기는 0(CSP 기본값)이 된다.
디스크 타입 목록이 코드에 박혀 있어 cb-tumblebug assets/diskinfo.yaml 과 어긋나 있었다.
Tencent 현세대 인스턴스(S8 등)는 시스템 디스크로 CLOUD_BSSD·CLOUD_HSSD 만 지원하는데
목록에 없어 고를 수 없었고, 비워 보내면 기본값 CLOUD_PREMIUM 으로 노드풀이 만들어져
CVM 생성이 "[19045] CVM not support the required disk" 로 매번 거부됐다.
NodeGroup 은 Active 로 보이지만 노드가 한 대도 뜨지 않았다.

CLOUD_TSSD 는 시스템 디스크가 될 수 없어 넣지 않는다. 이 목록은 VM 생성·데이터 디스크
생성에도 쓰이므로 기존 크기 최솟값은 바꾸지 않았다.
NCP Simple(dynamic) 생성은 체크 해제 시 {on:false, min:0, max:0} 을 보냈다.
tumblebug 은 dynamic 생성에서 min<=0 이면 1, max<=0 이면 2 를 주입해 {false,1,2} 가 되고,
NCP 드라이버 validateNodeGroupInfoList 가 "If MinNodeSize is specified, OnAutoScaling must be
enabled." 로 거부해 생성이 항상 실패했다. 생성 폼 체크박스는 해제 고정이라 우회할 수도 없었다.

NCP 생성은 autoscale 을 적용하지 않고(NodeCount=desired) 드라이버 검증은 min==max 를 허용하므로
on + min=max=desired 로 보낸다. 결과는 고정 크기로 폼 표시와 같다. NHN 이 이미 같은 방식이다.
Expert·Add 는 주입이 없어 {false,0,0} 그대로 둔다.
NHN NodeGroup API 는 max_node_count >= 1 을 요구한다. 규칙 모듈의 NHN
create.off.add 가 { on:false, min:0, max:0 } 이라 Add NodeGroup 이 항상
"Invalid input for field/attribute max_node_count. Value: '0'" 로 거부됐다.

클러스터 생성 경로는 드라이버가 autoscale 을 라벨로 처리해 같은 값으로
통과하므로 Add 경로에만 있는 제약이다. autoscaling off 는 그대로 두고
max 만 desired 로 채운다 — tumblebug 직접 호출로 {false, 1, 0, 1} 이
201 로 통과함을 확인했다(조회값 on=false, 0/1).

cb-spider NHN validateNodeGroupInfoList 가 min>0 && !on 을 거부하므로
min 은 0 을 유지해야 한다.
수정 모달만 NHN·Alibaba·IBM 에서 Desired 를 readonly 로 잠그고 입력값을 버렸다.
드라이버의 ChangeNodeGroupScaling 이 desiredNodeSize 를 CSP 로 전달하지 않기
때문인데, 생성 폼은 같은 CSP 에서 잠그지 않는다 — create.off 번역표로 min/max 를
desired 에 맞춰 보내기 때문이다. 같은 번역을 수정 경로에도 적용한다.

- Desired 를 전 CSP 에서 편집 가능하게 하고 생성 폼과 같은 -/+ 스테퍼를 붙였다.
  바닥값은 드라이버 제약을 따른다 (NHN·Alibaba·IBM 1, 나머지 0)
- 체크 해제(고정 크기)를 NHN·Alibaba 는 Change(d,d,d) → 대기 → Set(off),
  IBM 은 Change(d,d,d) → Set(off) 로 번역한다
- NHN 은 Set 단독 호출이 ca_enable 만 보내 저장된 ca_max_node_count(autoscaling
  off 로 만든 NodeGroup 은 0)로 검증돼 409 가 난다. Change 가 먼저 max 를 채우므로
  이 순서가 필수다
- 대기 스텝에 optional 을 추가했다. 타임아웃이 Set(off) 를 막으면 autoscaling 이
  켜진 채 남는다
- NHN 은 드라이버가 범위를 현재 노드 수에 맞춰 넓히므로, 고정 크기 경로는 막지 않고
  노드 수가 그대로일 수 있다고 미리 알린다
- modify.desiredEditable 을 지우고 desiredAppliedViaRange / desiredMin /
  clampsRangeToNodeCount 로 나눴다

규칙 모듈(k8sScalingRules.js) 변경분은 동시에 진행된 aa37d57 커밋에 함께 담겼다.
NHN 실자원 검증에서 Change(d,d,d) 뒤의 Set(off) 가 400 으로 거부됐다.

  status 400, title: NodegroupSetClusterAutoscaler ... nodegroup nhng0915
                     status UPDATE_IN_PROGRESS is not supported.

대기 스텝은 타임아웃된 것이 아니라 **조건이 잘못 충족**됐다. tumblebug 과
cb-spider 는 상태를 Active/Creating 으로 정규화하면서 CSP 원본 상태를 버리는데,
NHN 은 NodeGroup 이 UPDATE_IN_PROGRESS 인 동안에도 Active 로 보고된다.
그 사이 autoscale 호출은 NHN 이 거부한다.

원본 상태는 이미 조회값에 있다 — tumblebug 의 keyValueList 에
Status=UPDATE_IN_PROGRESS / UPDATE_COMPLETE 로 남는다.

- fetchScalingState 가 keyValueList 의 Status 를 cspStatus 로 함께 읽는다
- isSettled 가 cspStatus 의 *_IN_PROGRESS 를 미완료로 판정한다.
  원본 상태를 안 주는 CSP(Tencent 확인)는 cspStatus 가 비어 기존과 동일하게 동작한다
- 대기 스텝의 optional 을 되돌렸다. "못 기다렸으면 그냥 보낸다"가 이번 실패의
  원인이었다 — 어차피 거부당하고 최종 상태도 같은데 실패 이유만 불명확해진다.
  못 기다리면 멈추고 사유를 알린다

실자원 실측 (default/nhs0915/nhng0915, 2026-09-16):
  수정 전 Change 200 → 67초 → Set 400, autoscaling 켜진 채 남음
  수정 후 Change 200 → 143초 → Set 200 result:"true", 최종 ca_enable:false
NHN 수렴에 143초가 걸린다 — 처음 잡은 60초 타임아웃으로는 못 기다린다.
기본값 3분을 쓴다. mock 59건 통과.
플랫폼의 가용 버전 목록은 정적 목록이라 CSP 가 패치 버전을 올리면 어긋난다.
Alibaba 는 목록 5개가 전부 CSP 허용 버전과 맞지 않아 Expert·Simple 어느 경로로도
클러스터를 만들 수 없었고, Version 이 select 라 목록 밖 값을 고를 수단도 없었다.

- Version 을 input+datalist 로 바꿔 직접 입력을 받는다 (Expert, Simple 신설)
- 입력값이 조회 목록 밖일 때만 skipVersionCheck=true 를 붙인다.
  목록에서 고른 값에는 붙지 않는다 — 무조건 붙이면 전 CSP 에서 오타 방어가 사라진다
- Simple 은 비워두면 기존 동작(첫 항목 자동 선택)을 유지한다.
  NodeGroup 을 함께 만드는 분기는 버전을 아예 보내지 않아 플랫폼이 정적 목록에서
  자동 선택하던 곳이라, 입력 버전을 두 분기 모두에 적용한다
- 목록 밖 버전 입력 시 검증을 건너뛴다는 안내를 제출 전에 표시한다
- CSP 가 버전을 거부하면 응답에 실려 오는 허용 버전 목록을 뽑아 재시도 방법과 함께 알린다

Gate 전체 통과, Playwright 8 tests 통과 (TC-01~TC-16).
특정 Node/NodeGroup 대상 원격 명령·파일 전송이 옛 이름(vmId/subGroupId)으로
나가고 있어 mc-infra-manager가 필터를 인식하지 못하고 Infra 전체 Node에
실행되던 문제를 수정한다.

- remotecmd_api.js 4곳의 queryParams 키를 nodeId/nodeGroupId로 정정
- cmd.go/upload.go 주석의 옛 파라미터명 표기 갱신
- 실행 전 확인 모달 신설: 대상 범위·대상 노드 수·노드 목록·명령어를 보여주고
  위험 명령 패턴 12종은 차단이 아니라 경고로 표시 (정당한 운영 명령 차단 방지)
- 파일 전송 10MB 검증을 Dropzone·postFileToMci·upload.go 3계층에 추가.
  기존에는 Dropzone maxFilesize가 addedfile을 막지 못해 base64 인코딩·전송을
  모두 마친 뒤에야 실패했다
- 호출처 0건이면서 동일 기능이 별도로 존재하던 죽은 코드 6개 삭제,
  transferFilesToMci의 중복된 vm/else 분기 통합
- 입력/결과 섹션 전환을 실행 확인 이후로 이동. 기존에는 확인 모달을 띄우기
  전에 입력 섹션을 숨겨, 취소하면 빈 결과 화면만 남고 되돌아갈 수 없었다
- 단발 실행 모달을 다시 열 때 입력 화면으로 초기화. 한 번 실행하면 이후
  재오픈 시에도 계속 결과 화면으로 열리던 문제를 함께 해소
- 동일한 섹션 ID 매핑이 3곳에 중복돼 있어 setCommandSections 로 통합
develop에서 mci_api.js가 infra_api.js로 파일명만 변경되었으나, 확인 모달의
대상 노드 조회가 옛 모듈 키(common/api/services/mci_api)를 문자열로 참조하고
있어 조회가 항상 실패했다. 실패는 catch에서 흡수되어 확인 모달이
"Target node count could not be verified."로 표시된 채 동작했다.
NHN 실자원에서 Change 후 NodeGroup 이 UPDATE_COMPLETE 로 수렴하기까지
143초·178.5초가 걸렸다(2026-09-16). 기본 대기 타임아웃 180초로는 여유가 없어
조금만 느려져도 Set(off) 를 보내지 못하고 멈춘다.

waitStep 에 옵션을 다시 받게 하고, NHN·Alibaba 가 공유하는 해제 계획의 대기만
300초로 늘린다. 다른 CSP 는 수렴이 빨라(Azure·GCP 약 22초) 기본값을 유지한다.
78a3b77 에서 NHN·Alibaba·IBM 의 messages.fixedSize 를 수정 모달 동작
(min=max=desired 로 적용한 뒤 autoscaling 을 끈다)에 맞춰 바꿨는데, 같은 키를
생성 폼(Expert/Add/Simple)도 쓰고 있어 Add NodeGroup 폼에 틀린 문구가 떴다.
NHN Add 는 { on:false, min:0, max:desired } 를 한 번에 보내고 끄는 단계가 없다
(2026-09-17 실자원 k8s-live 2단계 로그의 ADD hint 로 확인).

- fixedSize 는 생성 폼용으로 이전 문구를 되돌린다
- 수정 모달용 fixedSizeModify 를 추가하고, 모달은 이 키가 있으면 우선 쓴다
- 다른 CSP 는 두 경로의 동작이 같아 공유 문구를 그대로 둔다

mock 59건 통과.
fix: K8s 클러스터 생성에서 목록 밖 Kubernetes 버전 입력 허용 및 CSP 허용 버전 안내
fix: Remote Command/File Transfer에서 Infra 전체 Node에 실행 보완
develop 의 PR #294(K8s 목록 밖 버전 입력, WEB-TECH-099)·#295(원격 명령 파라미터)를
합친다. 충돌 1건(clustercreate.js createCluster)을 양쪽 동작을 모두 살려 해결했다.

- 이 브랜치(WEB-BUG-100): NodeGroup 필수 CSP 사전 검증, 생성 요청을 await 해
  dispatched 가 아니면 실패 토스트 후 중단
- develop(WEB-TECH-099): 목록 밖 버전일 때만 buildVersionQueryParams 로
  skipVersionCheck 를 실어 보냄
- 해결: 사전 검증 → versionQueryParams 계산 → await CreateCluster(..., versionQueryParams)
  → dispatched 확인. 자동 병합된 k8s_api.CreateCluster 는 9번째 인자 queryParams 를
  받고 { dispatched: true } 를 반환해 두 쪽과 모두 맞는다

검증(mock, 병합 빌드 :3003): web-fix-002 + web-bug-093 + web-tech-099 67건 중 66 통과,
실패 1건(web-tech-099 TC-06/TC-08)은 mock 되지 않은 RecommendK8sNode 가 실서버에서
6.1초 걸려 테스트의 4초 대기를 넘긴 타이밍 문제 — 같은 빌드 재실행 통과.
화면은 CSP 와 무관하게 같아야 한다 — Off 면 Desired 만, On 이면 Desired·Min·Max.
지금까지는 드라이버가 desired 를 받지 않는 CSP(Alibaba·NHN·IBM)에서 입력을 잠가,
같은 화면인데 CSP 마다 할 수 있는 일이 달랐다.

- 규칙표를 UI 정책이 아니라 드라이버 사실 선언으로 전환한다
  (changeAppliesDesired / changeForcesEnable / set / offMode / enableOrder /
   waitBetween / clampsRangeToNodeCount). 드라이버가 고쳐지면 사실 하나만 내리면 된다
- buildModifyPlan 의 CSP 8-arm switch 를 없애고 사실값 기반 단일 알고리즘으로 바꾼다.
  산출 계획은 기존과 같고, Alibaba·NHN 켜기에만 Set(on) 한 단계가 붙는다
- 안내 문구를 CSP 별 상수 대신 사실에서 조립한다(describeOffBehavior/describeDesiredHandling)
- Desired 입력 잠금을 없앤다. 드라이버가 desired 를 안 받으면 잠그는 대신
  min=max=desired 로 번역하고 그 사실을 알린다
- set 스텝을 멱등화한다 — 보내기 직전 현재 상태를 확인해 이미 만족하면 건너뛴다.
  Azure 의 동일 상태 Set 에러를 피하고, 드라이버가 Change 로 모드를 같이 바꾸는
  CSP 에서 불필요한 Set 을 막으며, 드라이버가 고쳐져 Set 이 실제로 필요해져도 같은 계획이 맞는다

부수 효과: 해제 대기 조건을 on 플래그에서 노드 수 도달로 바꿔,
Alibaba 에서 해제와 함께 노드 수를 늘리면 반영되지 않던 문제가 해소된다.
Alibaba·NHN·IBM 에서 desired 만 바꾸는 조작이 더 이상 "변경 없음"으로 막히지 않는다.

Gate 전 항목 통과, 목 기반 회귀 47/47 통과(CSP 8종 전수).
…tract

feat: K8s NodeGroup 스케일링 화면 계약을 전 CSP 동일하게 통일하고 CSP 번역을 사실 기반으로 단일화
@MZC-CSC
MZC-CSC merged commit 33c377b into m-cmp:main Sep 19, 2026
4 checks passed
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.

2 participants