Skip to content

Latest commit

 

History

History
80 lines (71 loc) · 24.7 KB

File metadata and controls

80 lines (71 loc) · 24.7 KB

pythonMachine - 파이썬 머신 캠페인 (browser-os 이니셔티브의 실측 레인)

runtimeParity(로컬 따라잡기)와 별개의 개념 캠페인이다: 꺼지지 않고 파일 하나로 이동하는 컴퓨터. 세부 질문은 폴더가 아니라 probe 파일로 늘린다. 정본 계획: mainPlan/_done/browser-os

가설

결정적 리플레이 + 사용자 델타 + OPFS(디스크/코어/휠 캐시)를 합치면, 브라우저 탭이 hibernate/resume되고 .pymachine 파일로 이동하는 완전한 파이썬 머신이 된다. 각 질문은 브라우저 실측으로만 판정한다.

졸업 게이트 (질문별)

질문 probe 게이트
부팅이 결정적인가(성의 토대) bootDeterminismProbe.html 시드/엔트로피 고정 시 상이 페이지 0
선형 메모리 되쓰기만으로 되나 crossKernelProbe.html (부정 실측: 벽 좌표 확정용)
델타만으로 동형 커널에서 부활하나 replayForkProbe.html 상태 전부 생존 + ms급 적용
힙이 자란 세션도 부활하나 sessionGrowProbe.html 성장 세션 복원 정확 + 연속 실행
컴퓨터가 파일 하나로 이동하나 machineImageProbe.html 단일 파일 + SHA-256 + trust 게이트 + WebCrypto signature + 힙과 /home 부활
디스크가 커널을 넘어 사나 homeDiskProbe.html /home/web 파일이 새 커널에서 생존
네트워크 없이 부팅되나 offlineBootProbe.html 2차 부팅 fetch 계층 miss 0
script 경로까지 오프라인 되나(구멍 봉인) swOfflineProbe.html SW 캐시-우선으로 2차 부팅 CDN 요청 전량 캐시(miss 0)
런타임 자산이 핀된 바이트인가 runtimeIntegrityProbe.html pyodide.js SRI + coreIntegrity strict manifest + OPFS 캐시 변조 거부
머신이 탭 밖에서 사나(커널 데몬) sharedKernelProbe.html 연결 2개(=탭 2개)가 같은 파이썬 상태 공유 + 동시 요청 정합
헤더 못 다는 호스팅(GH Pages)에서 머신이 뜨나 noCoiProbe.html COI=false에서 부팅/세션 부활/.pymachine/디스크 전부 정상(SAB만 경계)
SW 헤더 주입으로 SAB를 열 수 있나 swCoiProbe.html ?coi=1 등록 + 1회 새로고침 후 crossOriginIsolated=true + SAB 실사용
브라우저 능력이 파이썬 파일이 되나(Plan 9) deviceFsProbe.html open() 쌍방 브리지 + 동적 읽기 + /proc 커널 상태 + with/부분읽기 정합
머신이 스스로 일하나(init/cron) initProbe.html boot.py 오토스타트 + cron 주기 틱 + /home으로 세대 계승 + 파일 없으면 no-op
부활 후 프로세스 자원을 다시 여나 resumeHookProbe.html Session.load/MachineJournal.recover/openMachine 뒤 resume.py가 sqlite connection 재개설 + reason 주입 + 파일 없으면 no-op
체크포인트가 나무가 되나(머신의 git) branchProbe.html 분기 후 임의 노드 스위치가 형제 델타에 오염되지 않음(선형 체인이면 RED)
살아있는 커널을 진짜 fork할 수 있나 forkLiveProbe.html 두 커널의 cp0이 바이트 동일 + 부모 상태(변수·배열·계산)가 자식에서 생존 + 주소공간 독립
강제종료해도 마지막 커밋으로 부활하나(WAL) journalProbe.html clean save 없이 커널을 버려도 유휴 커밋 + recover()로 부활 + CAS dedupe(승격 계약 재실측 창구)
장기 저널 파일 수를 줄일 수 있나 journalPackProbe.html HEAD/PREV live blob만 pack 파일 1개로 묶고 loose/stale 파일 제거 + autoPack + pack-aware dedupe + pack-only recover + PREV fallback
저널 비용의 정체와 배치 이득은 churnProbe.html no-op 문장의 churn 바닥과 그 고정성 + 배치 시 총 쓰기량 절감률(승격 설계 판정)
파이프+공유메모리 = 흐름 IPC가 서나 (P4) pipeShmProbe.html 처리량 >= 200MB/s + 소메시지 편도 p50 < 0.5ms + backpressure 무손실(md5) + 블로킹 read 중 SIGTERM 회수 + 워커 생존 + 락 상호배제 + 커널 엔드포인트 왕복
파일이 브라우저의 전부를 만지나 (P7 fsWorld) fsWorldProbe.html /dev/random 신선 + /dev/fb0 640x480 >= 30fps + /var/log 재부팅 생존 + /proc//ctl 쓰기=시그널 왕복 < 60ms
머신 안에 머신이 서나 (P5 containers) machineContainerProbe.html 컨테이너 부팅 < 1500ms(스냅샷 fork) + 외부-내부 RPC + 깊이 2 + 파이썬 값 노출 + 내부 kill 외부 무영향
탭과 모든 participant 종료를 넘어 Python 머신이 사나 kernelElectionProbe.html 독립 browsing context 3개 + 리더 하나 + 영속 epoch/fencing + participant request ID 무충돌 + late response 폐기 + RPC p50 < 3ms + 리더 context 강제 제거 후 failover < 5s + 힙과 /home과 prepared environment 복구 + in-flight RPC outcome 계약 + 모든 context 종료 뒤 cold reopen
셸의 &가 서나 (P3 jobControl) jobControlProbe.html 프롬프트 복귀 < 100ms + 잡 실행 중 대화형 5문장 + %fg가 fork된 네임스페이스로 계산 회수 + %kill < 200ms(무한 루프 회수) + 슬롯 재사용
권한 감옥이 서나 (P6 machineJail) jailProbe.html 협조 티어 권한 판정 + CSP connect-src가 비허용 host fetch 차단(self 허용) + 감옥 CSP에서 pyodide 부팅 오버헤드 < 1.5x + opaque origin이 window.parent 봉인

결론 표

날짜 probe 환경 핵심 수치 결론 판정
2026-07-11 crossKernelProbe Edge headless A(30MB) 이미지를 새 부팅 B에 전체 되쓰기 + 스택 복원 -> SystemError: Type does not define the tp_name field 벽 좌표: 커널 상태는 선형 메모리만이 아니다(WASM globals + JS 측 미러가 이미지 밖). 동일 인스턴스 복원(우리 리액티브)은 그래서 되고, 크로스 인스턴스는 전체 머신 상태 캡처가 필요 불멸 커널은 (a) 부팅 결정성 실측, (b) 전역/JS 상태 목록화 후 재시도. 프론티어 후보
2026-07-11 bootDeterminismProbe Edge headless 무조치 2회 부팅 = 180p 상이. PYTHONHASHSEED=0 + 엔트로피/시간 스텁 = 0p 상이(bare와 numpy 리플레이 모두, 힙 길이 동일) 부팅이 바이트 단위 결정적. tp_name 크래시 원인(시드 레이아웃 시프트) 확증 리플레이+델타 경로 개방
2026-07-11 replayForkProbe Edge headless A의 사용자 상태(변수+numpy 배열)를 델타 160p/10MB로 수확, 동형 리플레이 B에 1.5ms 적용 -> 상태 생존·연산·연속 실행 전부 정확 불멸 커널/warm-fork 실증. hiwire 벽을 upstream 수정 없이 우회 졸업 -> session.js bootSession/Session.save/load(게이트 상시: 크로스 커널 부활 95p/5.9MB)
2026-07-12 sessionGrowProbe Edge headless 30->65MB로 자란 세션(42.4MB 저장)을 새 커널이 354ms에 부활. 발견 2건: JS에서 Memory.grow 직접 호출은 글루 클로저 뷰 미갱신으로 파손(파이썬 할당 경로가 정답), 성장 루프의 흔적은 restore(0) 되감기 후 델타 적용으로 해소 성장 세션 부활 성립(Session v2) 졸업 -> session.js(load가 파이썬 성장 + 경계 되감기 + 델타), wheelDir 매니페스트 결합 포함
2026-07-12 machineImageProbe Edge headless 13.7MB .pymachine 단일 파일(내보내기 59ms), trust 없이는 거부, 1바이트 변조 거부(SHA-256), 파일로 부팅 2.5s에 상태 전부 생존 파일 하나 = 살아있는 컴퓨터 성립(신뢰 모델 포함) 졸업 -> exportImage/openMachine
2026-07-15 machineImageProbe(/home + signature + fingerprint) Edge headless, 로컬 COOP+COEP .pymachine home payload + WebCrypto signature GREEN 12/12. /home/web 파일 트리가 단일 파일에 포함되고, trusted public key로 trust: true 없이 openMachine 부활. 공개키 fingerprint는 CryptoKeyPair/JWK 양쪽에서 같은 sha256:<hex>이고, 다른 공개키는 거부. 파일 15MB, export 75ms, open 1608ms .pymachine이 힙 델타와 디스크 스냅샷뿐 아니라 출처 검증과 제품 UI용 signer fingerprint까지 가진 portable machine image가 됐다 승격 -> Session.exportImage({ includeHome, signingKey }), createMachineKeyPair, exportMachinePublicKey, fingerprintMachinePublicKey, openMachine({ trustedPublicKeys })
2026-07-12 homeDiskProbe Edge headless /home/web 마운트: python open/os로 쓴 파일·디렉터리·바이너리가 다른 커널에서 생존. 발견: pyodide 기본 /home 비어있지 않아 기본 경로는 /home/web 영속 디스크 성립 졸업 -> Runtime.mountHome
2026-07-12 offlineBootProbe Edge headless 코어 3종(wasm/stdlib/lock) OPFS 캐시, 2차 부팅 hit 3/miss 0(fetch 계층 네트워크 0), 웜 2457ms vs 콜드 4006ms. 한계: pyodide.js/asm.js는 script 경로라 fetch 밖(완전 오프라인은 SW 몫) boot({coreCacheDir}) 성립 졸업 -> runtime.js coreCacheDir 옵션(rt.coreCache 통계). 무한재귀(fetch 재진입) 결함 수정
2026-07-12 swOfflineProbe Edge headless SW 캐시-우선: 1차 부팅이 CDN 5건 채움(pyodide.js/asm.mjs script 경로 포함), 리로드 후 2차 부팅 CDN miss 0(hit 3, 잔여 2건은 브라우저 메모리 캐시 = 역시 네트워크 0), 2391ms 기둥5의 남은 구멍(script 경로) 봉인 = 완전 오프라인 등가 성립 졸업 -> pyprocSw.js(?cache=1, coreCache와 상보)
2026-07-15 runtimeIntegrityProbe Edge headless, 자가 호스팅 경로 GREEN 6/6. 잘못된 pyodide.js SRI 거부, 올바른 SRI 부팅 2195ms, coreIntegrity 캐시 hit 검증 2189ms(verified 3, miss 0), strict manifest 누락 거부, OPFS 캐시 변조 거부 부트 자산 신뢰 체인 v1 성립. pyodide.js와 fetch 경로 core 자산은 핀된 바이트만 실행한다 졸업 -> boot({ engineScriptIntegrity, coreIntegrity }). 이후 pyproc worker graph는 verifyPyProcAssetIntegrity()assetIntegrity preflight로 승격
2026-07-15 browser gate Service Worker asset seal Edge headless GREEN. registerPyProcServiceWorkerpyprocServiceWorker graph를 SRI 검증한 뒤 manifest URL로만 등록. SW coreIntegrity=/pyproc-assets.json가 허용 path 200, manifest 누락 path 500으로 수렴. product consumer gate도 설치된 패키지에서 같은 helper 등록 성공 Service Worker 등록 문자열과 검증 자산이 분리되는 구멍을 닫고, 브라우저 동적 import가 JavaScript fetch wrapper 밖에서 가져가는 script/module 경로를 SW 계층에서 검증한다 졸업 -> registerPyProcServiceWorker + pyprocSw.js?cache=1&coreIntegrity=...
2026-07-12 sharedKernelProbe Edge headless SharedWorker(module) 커널 부팅 4253ms, 연결 A의 x=41을 연결 B가 x+1=42로 조회, 동시 요청 정합. 벽: crossOriginIsolated=false(플랫폼 제약) = SAB 불가, JSPI는 true 머신이 탭 밖에서 산다(여러 탭 = 한 상태). interrupt/스냅샷-fork는 이 커널에서 불가(SAB) 졸업 -> SharedKernel(실행/상태 공유 v1). SAB 기능은 플랫폼 COI 지원 대기
2026-07-12 noCoiProbe Edge headless(헤더 제거 서버) COI=false/SAB 잠김 확인 후: 부팅 3533ms, 세션 부활 115p/7.2MB, .pymachine 왕복 1804ms, /home 디스크, JSPI=true 전부 정상 머신 핵심 동선은 COI 불필요(SAB 쓰는 프로세스 OS만 경계) = GitHub Pages에 그냥 올려도 대표 데모가 돈다 GH Pages 데모 배포 채택 근거
2026-07-12 swCoiProbe Edge headless(헤더 제거 서버) pyprocSw(?coi=1) 등록 + 1회 새로고침 -> crossOriginIsolated=true, SAB 생성 + 워커 Atomics 쓰기 관측, 일반 서빙 무파손 헤더 못 다는 호스팅에서도 SAB 복구 성립(opaque는 원본 통과 = CDN 자체 CORP 전제, jsdelivr ok) 졸업 -> pyprocSw.js ?coi=1 + processOs.html 부트스트랩
2026-07-12 deviceFsProbe Edge headless Emscripten FS 장치 등록: 파이썬 write -> JS 싱크 / JS 소스 -> read, /dev/clock 열 때마다 신선, /proc/meminfo가 실제 힙과 일치, /proc/ps 제공자 배선, read(4)/with문/os.path.exists 정합. 클립보드 쓰기는 headless 권한 거부(정직 기록) 모든 것은 파일 성립(새 API 표면 0: open()이 계약). 비동기 소스는 캐시+refresh가 정직한 계약 졸업 -> DeviceFs(enableDeviceFs: 내장 /proc/meminfo·/dev/clipboard + 소비자 장치)
2026-07-12 initProbe Edge headless 디스크에 심은 boot.py가 다음 부팅에서 자동 실행(4ms, counter 1), cron.py 300ms 틱 1.05s에 3회, 3세대 부팅이 counter=2로 계승, 파일 없으면 no-op 머신이 스스로 일한다(rc.local+cron, 전부 파일 주도 = 배선 코드 0) 졸업 -> Init(enableInit) + machine.html 배선
2026-07-15 resumeHookProbe Edge headless GREEN 8/8. Session.load resume.py 24ms, MachineJournal.recover 8ms, openMachine 10ms. resume.py가 pyprocResumeReason을 받고 sqlite connection을 resumeConn으로 재개설. 세 경로 모두 resumeValue=41 유지, missing resume.py no-op 힙 델타/머신 이미지는 열린 fd/socket/DB connection을 보장하지 않는다는 경계를 API 계약으로 닫았다. 부활 후 자원은 resume.py가 다시 연다 승격 -> Init.resume(reason), resumePath
2026-07-12 branchProbe Edge headless 선형 체인의 실결함 재현: 분기 노드로 스위치하면 RuntimeError: memory access out of bounds(6/7 RED). 원인 = 델타 해석이 배열 역순(k-1)이라 버려진 형제 분기의 페이지를 집는다. 부모 체인 walk로 수정 후 10/10 GREEN(분기 왕복/형제 가지/삼중 스위치 전부 정확, 판별 검사는 라이브를 base로 고정해 우연 일치를 제거) 체크포인트 나무 = 머신의 git 성립. %undo(뒤로만)에서는 무증상이었고 분기를 여는 순간 힙이 깨지는 결함이었다 졸업 -> reactive.js parents 체인 + tree(). 게이트 상시
2026-07-12 forkLiveProbe Edge headless 관문 1차 RED: 메인 커널 vs 워커 커널 리플레이는 힙 길이는 같아도 바이트가 다르다(로더/컨텍스트 차이 = 벽 좌표). 워커 대 워커는 바이트 동일 -> 8/8 GREEN: 델타 164p/10.3MB 수확 43.6ms, 적용 1.4ms, 왕복 4ms. 부모의 변수·bytearray·계산 결과가 자식에서 생존, 자식 변이는 부모에 무영향(독립 주소공간), 자식이 부모 상태 위에서 연속 계산 살아있는 커널의 진짜 fork(2) 성립. 스냅샷-fork(bare 이미지 복제)와 다르다: x = bigDf가 자식으로 실린다. 단 대칭 컨텍스트(워커끼리)가 전제 졸업 -> PyProc({replay}) + fork(src, dst). 커널을 워커로 옮기는 설계(P3)의 근거
2026-07-12 journalProbe(1차, 문장단위) Edge headless 문장 경계마다 CAS append + HEAD commit. clean save 없이 커널을 버려도 부활 5/5 GREEN. 비용 발견: 문장당 변경 중앙값 128p(8MB), 문장당 커밋 ~1s 강제종료 내성 실증. 그러나 naive 문장단위 WAL은 무겁다 개념 졸업, 승격 보류 -> churnProbe로 원인 규명
2026-07-12 churnProbe Edge headless churn 바닥의 정체 규명: no-op 문장(1)조차 90106p(6MB)를 더럽히고, 그 페이지 **집합은 9798% 고정**이다(CPython eval/GC의 scratch 워킹셋 = 사용자 상태와 무관). gc.freeze도 못 줄인다. 배치의 고유 페이지 절감은 1~5%뿐이지만 총 쓰기량은 88% 절감(문장별 765p vs 배치 1회 91p = 8.4배) 커밋 단위는 문장이 아니라 유휴다: churn 바닥은 못 줄이므로 커밋 빈도가 비용을 지배한다. 문장단위 WAL 기각, 유휴 배치 확정 P1 승격 설계 확정
2026-07-12 journalProbe(승격 계약) Edge headless rt.enableJournal({dir, reactive, idleMs}): 유휴 판정 후 자동 커밋(139p), hibernate 없이 커널을 버려도 새 커널이 recover()로 부활(140p/8.8MB, 2330ms), 저널 없으면 null(첫 부팅), CAS dedupe 동작. 7/7 GREEN 강제종료 내성이 계약이 됐다. 커밋은 비동기라 REPL 비차단(커밋 1회 완료 ~2s는 OPFS 파일 생성 비용 - 다음 최적화 후보: blob을 개별 파일 대신 append-only 팩으로) 졸업 -> MachineJournal(enableJournal). 재실측 창구로 유지
2026-07-12 journalProbe(심판 수리) + 게이트 fork Edge headless 객관 심판이 찾은 급소 2건 수리 실측: ① recover가 경계 지문(h0) 불일치 시 명시적 예외(오염 HEAD 조작 -> 예외 발화, 8/8 GREEN. 이전엔 다른 엔진의 저널을 조용히 덮었다) + start()가 storage.persist() 요청(디스크의 best-effort 캐시 강등 방지) ② fork 자식측이 델타 밖 드리프트를 cp0으로 되돌린다(더러운 dst 정화 2p 실증, 마커 배타 검사, 게이트 35/35). 적용 비용 1.4ms -> 33ms(힙 1회 스캔 = 정확성의 값) + parentPid 계보 기록 조용한 힙 오염 경로 2개가 닫혔다. fork는 이제 정확히 "경계 + 부모 델타"를 만든다 machineJournal.js(h0/persist) + worker.js(정화) + pyProc.js(parentPid) 반영 완료
2026-07-15 journalPackProbe Edge headless MachineJournal.pack()/autoPack GREEN 10/10. 2세대 커밋 후 loose blob 223개 -> pack 파일 1개 + loose 0개, pack 2491ms. prune()이 stale loose 1개와 stale pack 1개 제거. pack-only HEAD recover(value=22), HEAD 파손 후 pack PREV fallback(value=11), autoPack 커밋 직후 pack(trigger=121), pack 후 재커밋 wrote=0 모두 정상 장기 OPFS 파일 수 축이 닫혔다. 기존 loose blob 포맷은 계속 읽고, 새 PACKS.json + pack/*.bin 계층은 recover 경로에 투명하게 붙는다. 자동 정책은 autoPack: true 또는 명시 임계값으로 opt-in한다 승격 -> MachineJournal.pack()/prune()/autoPack. 다음은 제품 소비 배선과 공개키·권한 UI
2026-07-13 pipeShmProbe (P4) Edge headless(자가 호스팅 경로) SAB 링버퍼 파이프 + 명명 shm + 락. 처리량 982.9MB/s(64MB/1MB 링) + 소메시지 편도 p50 0.092ms(p90 0.135) + backpressure 무손실(8MB를 256KB 링으로, md5 동일) + 블로킹 read 중 SIGTERM 회수 + 워커 생존(535ms) + 락 상호배제(2프로세스 x 300 = 정확히 600) + 커널 엔드포인트 왕복. GREEN 6/6 흐름 IPC 성립: map(배치)과 다른 스트리밍이 섰다. 유한 슬라이스 wait가 블로킹 read에 시그널을 끼운다. 공유메모리는 memcpy 1회 계약(제로카피 불가 = 안티 추천 4 준수) 졸업 -> PyProc.pipe/lock/semaphore/shm/exec + src/processOs/ipc.js. EOF는 undefined(null은 JsNull 프록시)
2026-07-13 fsWorldProbe (P7) Edge headless(자가 호스팅 경로) DeviceFs 확장. /dev/random 신선(두 open 상이, 16바이트) + /dev/fb0 640x480 379.2fps(파이썬 RGBA bytearray -> close flush -> putImageData) + /var/log 재부팅 생존(OPFS 마운트, 세대 계승) + /proc//ctl 쓰기=시그널 왕복 55ms(< 60, SystemExit 회수). GREEN 5/5 모든 것은 파일 v2 성립: 장치 성장 + Plan 9 ctl(쓰기=시그널) + 프레임버퍼가 새 능력 0으로 한 네임스페이스에 들어왔다. mount는 mountHome 재사용 졸업 -> DeviceFs.track + framebuffer/signal cfg + /dev/random. write 장치 close flush 훅 추가
2026-07-13 machineContainerProbe (P5) Edge headless(자가 호스팅 경로) 컨테이너 커널을 워커에 스냅샷 fast fork로 띄운다. warm 부팅 274ms(bootMs 239, 스냅샷 1회 제조 2383ms amortize) + 외부-내부 RPC p50 1.38ms(< 2) + 깊이 2(컨테이너가 자기 자식 컨테이너 spawn, 값이 층 거슬러 옴, 503ms) + 격리(네임스페이스 부모에 안 샘) + 파이썬 값 노출(m = pyprocMachine.spawn(); m.run(...), 블로킹=JSPI run_sync) + 내부 kill 외부 무영향(주소공간 독립). GREEN 6/6 머신 안 머신 = 도커 3요소 성립: 이미지(.pymachine)+레지스트리(OPFS)+실행(이 능력). 스냅샷을 SAB로 중첩 자식까지 물려 fast fork 계승 졸업 -> MachineContainer(new MachineContainer(rt)) + machineWorker.js. Layer 2 독립(PyProc 패턴, runtime.js 순환 회피)
2026-07-13 kernelElectionProbe (P2) Edge headless(자가 호스팅 경로) iframe 3개 = 탭 3개. Web Locks 선출로 리더 정확히 하나(2739ms) + 3탭 RPC 정합(팔로워가 x=41 쓰고 다른 팔로워가 x+1=42 = 여러 탭 한 상태) + RPC 왕복 p50 1.07ms(BroadcastChannel, < 3) + 리더 iframe 제거(탭 죽음) -> lock 자동 해제 -> failover 2763ms(< 5s) + 저널 resume으로 x=41 생존(recovered=true, 재실행 아님). GREEN 5/5 OS가 탭 죽음에서 산다: iframe이 별도 browsing context = 별도 lock-holder라 헤드리스에서 탭 죽음/failover가 실측된다. 리더 커널은 자기 문서에 살아 COI 상속(SAB 유지) = SharedWorker 약속을 SAB 포기 없이 졸업 -> KernelElection(bootSession + MachineJournal + Web Locks + BroadcastChannel). Layer 2
2026-07-15 kernelElectionProbe (Immortal Python Machine) Edge headless, 자가 호스팅 경로 GREEN 12/12. 3 browsing context의 리더 하나 + 같은 machine/epoch, COI/JSPI 유지, 동시 follower request 무충돌, timeout 뒤 late response 폐기, RPC p50 0.98ms/p90 1.94ms. 리더 context 강제 제거 뒤 2183ms failover, journal recovery 583ms, 변수와 /home/web 파일과 manifest prepared environment 생존. 전송 중 요청은 PYPROC_RPC_OUTCOME_UNKNOWN으로 끝나며 자동 재실행 0. 모든 participant 제거 뒤 새 context가 epoch 3으로 2486ms cold reopen, 변수 2개와 파일과 준비 환경 복구 제품 정본은 SharedKernel이 아니라 **openPersistentMachine -> KernelElection + MachineJournal**이다. SharedWorker는 crossOriginIsolated=false라 보조 상태 공유 경로로 남는다. 영속 epoch가 stale leader를 fence하고, participant 고유 request ID와 leader-targeted response가 탭 간 충돌을 제거한다. 저널 HEAD/PREV는 힙과 home CAS blob을 한 commit 세대로 묶는다 승격 -> 설치 패키지 product consumer gate GREEN 28/28 + immortal demo
2026-07-13 jobControlProbe (P3) Edge headless(자가 호스팅 경로) replay 풀 위 잡 컨트롤. expr & = 대화형 레인을 잡 레인에 fork(2) 후 실행. 프롬프트 복귀 76.6ms(< 100) + 잡 실행 중 대화형 5/5 + %fg가 fork된 네임스페이스로 계산한 값 회수(data=range(100000)를 fork, sum(x*x)=333328333350000) + %kill 45.2ms(< 200, 무한 루프 SIGINT 회수 = state killed) + 슬롯 재사용. GREEN 8/8 브라우저 파이썬 최초의 job control: fork(워커끼리 대칭) 위에 선다. 대화형 REPL이 워커 레인(replay 풀 레인 0)에서 돌아 fork 대칭을 확보 = P2 예고("커널을 워커로")의 실현 졸업 -> JobControl + PyProc.repl + worker.js repl 메시지
2026-07-13 jailProbe (P6) Edge headless(자가 호스팅 경로) 2단 감옥. 협조 티어(pyprocJail): 허용 통과, 비허용 net/home = PermissionError. 브라우저 벽: 감옥 iframe CSP connect-src 'self'에서 example.com fetch 차단(감옥 코드 우회 무력 = 브라우저가 집행), self 허용. 감옥 CSP에서 pyodide 부팅 6*7=42, 오버헤드 0.93x(CSP는 헤더일 뿐). 정직 경계 실측: same-origin 감옥 window.parent 도달(네트워크 벽만) vs opaque origin 감옥은 부모 차단(완전 격리 = SAB 트레이드). GREEN 8/8 권한 감옥 성립(정직한 2단): 협조는 실수 방지, 최종 방어는 브라우저 CSP. "네트워크 egress 차단"은 same-origin 감옥에서 성립, "부모 완전 격리"는 opaque origin(SAB 포기)의 몫. 감옥은 자가 호스팅 엔진(connect-src 'self') 전제 = P0과 짝 졸업 -> MachineJail(협조 초크포인트 + csp() 생성)

판정

진행 중. 결정성/리플레이/성장/이미지+/home/서명 fingerprint/디스크/오프라인 2단/부트 자산 SRI v2/Service Worker 자산 봉인/공유 커널/호스팅 독립 2단/파일 세계/init/resumeHook/체크포인트 나무/forkLive/저널 WAL/저널 pack-prune/autoPack/IPC/컨테이너/커널 선출/잡 컨트롤/권한 감옥은 실측과 승격을 통과했다. 잔여 심화축은 외부 제품 trust/permission UI gate와 제품 표면 배선 확장이다.