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. registerPyProcServiceWorker가 pyprocServiceWorker 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)조차 90 |
커밋 단위는 문장이 아니라 유휴다: 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와 제품 표면 배선 확장이다.