Skip to content

feat(ade-1): 데스크톱 Workbench — cross-namespace 조정 프리미티브 (#251 서버 축소로 분리) #255

Description

@pdw96

Part of #250 (ADE 표면 메타 · 1축 Workbench 후행 범위) · 선행 = #251

배경

#251 체크포인트 3(계획) 진행 중, 락·토폴로지 층이 Codex 리뷰 6라운드 + 로컬 적대 검증 P1 12건 동안 수렴하지 않았다. 실패는 전부 하나의 불일치에서 나왔다:

레포 권위 범위는 파일시스템으로 공유되는데, endpoint 배타 범위는 net namespace 로 분할된다.

호스트 데스크톱 Electron 과 컨테이너 서버가 같은 레포를 동시에 열면 서로의 커널 endpoint 를 보지 못해 최초 획득에서 두 소유자가 성립한다. 이를 막으려 도입한 장치들이 매번 반대편(가용성)을 뚫었다 — 이중 소유 → 영구 고착 → 부정 판정 fail-open → cross-ns 이중 소유 → 컨테이너 교체 고착.

사용자 결정(2026-07-23): #251서버(컨테이너) 표면 전용으로 축소하고, 데스크톱 Workbench 를 이 이슈로 분리한다. 그 결정으로 #251 에서 토폴로지 게이트·handoff 상태 기계·netNsId 판정·locks/<key>.json 전체가 사라졌다(스펙 1,430→1,251행).

이 이슈가 풀어야 하는 것

데스크톱 Electron 에서 Workbench 를 쓰려면 cross-namespace 조정을 실제로 지원해야 한다. #251 에서 확인된 제약:

프리미티브 cross-ns 원자성 liveness(삭제 내성)
파일시스템 pathname(소켓·링크) ❌ (1~3R 에서 세 번 무너짐)
커널 endpoint(추상 소켓 / named pipe)
open('wx') create-only — (liveness 판단 불요)

두 성질을 동시에 주는 zero-dep 프리미티브가 없다는 것이 6라운드의 결론이다. 따라서 이 이슈는 다음 중 하나를 선택해야 한다:

  1. 네이티브 flock(2) — fd 에 걸리므로 pathname 삭제·net ns 와 무관하고 프로세스 사망 시 커널 자동 해제. 가장 정석적인 답이지만 이 레포 첫 네이티브 의존성(Electron + node 서버 두 ABI 재빌드 · CI 매트릭스 · asarUnpack · win32 서명). 현행 출하 의존성 6종이 전부 순수 JS 인 상태가 깨진다. U1(가디언 절삭)에서 같은 이유로 koffi 를 기각한 선례와 충돌하므로 ADR 필요.
  2. 단일 writer 토폴로지 — 서버만 mutation authority 를 갖고 데스크톱은 IPC/RPC 로 요청. cross-ns 동시 사용을 실제로 지원하면서 락은 단일 ns 안에만 존재한다. 새 RPC 표면·인증·재접속·버전 스큐 계약이 딸린다.
  3. 데스크톱 전용 코디네이션 영역 분리 — 데스크톱과 서버가 같은 레포를 공유하지 않는 토폴로지(feat(ade): 토폴로지 분리 — bare 정준 레포 + 소비자 클론으로 진짜 원클릭 통합 복원 #252 bare 정준 레포 + 소비자 클론)를 전제로 각자 자기 영역을 갖는다. feat(ade): 토폴로지 분리 — bare 정준 레포 + 소비자 클론으로 진짜 원클릭 통합 복원 #252 와 결합.

착수 전 확인된 사실 (재조사 불요)

  • win32 named pipe 는 머신 전역(NPFS) — 같은 머신의 두 사용자 세션은 같은 파이프 네임스페이스에서 경합한다(세션1 일반 사용자 프로세스에서 세션0 서비스 파이프 225건 열거로 실측). 즉 같은 머신 다중 Electron 은 이미 안전하고, 문제는 머신/네임스페이스가 갈릴 때뿐이다.
  • Linux 추상 소켓은 컨테이너에서 추가 권한 없이 동작(node:24-bookworm-slim · --user 1000:1000 · 기본 seccomp).
  • open('wx') 는 별개 net ns 두 컨테이너의 공유 bind 마운트 위에서 원자적(400개 동시 경쟁 생성, double-create 0건).
  • Node 24 에 fs.flock/LOCK_EX/O_EXLOCK 전부 부재.
  • Electron 이 requestSingleInstanceLock쓰지 않는다(grep 0건) — 같은 표면 다중 인스턴스가 성립한다.

범위

비범위

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:orchestrator오케스트레이터 실행/계획 루프enhancementNew feature or requesttier:later보류 (강등·블록·저가치)

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions