You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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라운드의 결론이다. 따라서 이 이슈는 다음 중 하나를 선택해야 한다:
네이티브 flock(2) — fd 에 걸리므로 pathname 삭제·net ns 와 무관하고 프로세스 사망 시 커널 자동 해제. 가장 정석적인 답이지만 이 레포 첫 네이티브 의존성(Electron + node 서버 두 ABI 재빌드 · CI 매트릭스 · asarUnpack · win32 서명). 현행 출하 의존성 6종이 전부 순수 JS 인 상태가 깨진다. U1(가디언 절삭)에서 같은 이유로 koffi 를 기각한 선례와 충돌하므로 ADR 필요.
단일 writer 토폴로지 — 서버만 mutation authority 를 갖고 데스크톱은 IPC/RPC 로 요청. cross-ns 동시 사용을 실제로 지원하면서 락은 단일 ns 안에만 존재한다. 새 RPC 표면·인증·재접속·버전 스큐 계약이 딸린다.
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건) — 같은 표면 다중 인스턴스가 성립한다.
범위
데스크톱 Electron 의 Workbench 활성화 · cross-namespace 조정 프리미티브 선택(ADR)
Part of #250 (ADE 표면 메타 · 1축 Workbench 후행 범위) · 선행 = #251
배경
#251 체크포인트 3(계획) 진행 중, 락·토폴로지 층이 Codex 리뷰 6라운드 + 로컬 적대 검증 P1 12건 동안 수렴하지 않았다. 실패는 전부 하나의 불일치에서 나왔다:
호스트 데스크톱 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 에서 확인된 제약:
open('wx')create-only두 성질을 동시에 주는 zero-dep 프리미티브가 없다는 것이 6라운드의 결론이다. 따라서 이 이슈는 다음 중 하나를 선택해야 한다:
flock(2)— fd 에 걸리므로 pathname 삭제·net ns 와 무관하고 프로세스 사망 시 커널 자동 해제. 가장 정석적인 답이지만 이 레포 첫 네이티브 의존성(Electron + node 서버 두 ABI 재빌드 · CI 매트릭스 · asarUnpack · win32 서명). 현행 출하 의존성 6종이 전부 순수 JS 인 상태가 깨진다. U1(가디언 절삭)에서 같은 이유로 koffi 를 기각한 선례와 충돌하므로 ADR 필요.착수 전 확인된 사실 (재조사 불요)
node:24-bookworm-slim·--user 1000:1000· 기본 seccomp).open('wx')는 별개 net ns 두 컨테이너의 공유 bind 마운트 위에서 원자적(400개 동시 경쟁 생성, double-create 0건).fs.flock/LOCK_EX/O_EXLOCK전부 부재.requestSingleInstanceLock을 쓰지 않는다(grep 0건) — 같은 표면 다중 인스턴스가 성립한다.범위
비범위