Skip to content

Commit e8ecb78

Browse files
committed
S4 machine resume 비교표와 원장 갱신
1 parent 10cd2cb commit e8ecb78

5 files changed

Lines changed: 57 additions & 8 deletions

File tree

docs/operations/benchmarking.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ S1은 현재 공개 속도 간판이다. S1L은 외부 후보가 S1의 병렬 wo
5454
| S1L single-kernel numpy latency | [측정됨](../../mainPlan/browser-os-north-star/benchmarks/s1l-pyproc-2026-07-15.json) | 측정 필요 | [측정됨](../../mainPlan/browser-os-north-star/benchmarks/s1l-jupyterlite-2026-07-15.json) | [측정됨](../../mainPlan/browser-os-north-star/benchmarks/s1l-marimo-wasm-2026-07-15.json) | S1 대체가 아니라 별도 single-lane 보조 축 |
5555
| S2 process map | [측정됨](../../mainPlan/browser-os-north-star/benchmarks/s2-pyproc-2026-07-15.json) | [N/A](../../mainPlan/browser-os-north-star/benchmarks/s2-webvm-na-2026-07-15.json) | [N/A](../../mainPlan/browser-os-north-star/benchmarks/s2-jupyterlite-na-2026-07-15.json) | [N/A](../../mainPlan/browser-os-north-star/benchmarks/s2-marimo-wasm-na-2026-07-15.json) | `PyProc.map` process pool 계약. 같은 API 후보가 없으면 N/A |
5656
| S3 browser server | [측정됨](../../mainPlan/browser-os-north-star/benchmarks/s3-pyproc-2026-07-15.json) | [N/A](../../mainPlan/browser-os-north-star/benchmarks/s3-webvm-na-2026-07-15.json) | [N/A](../../mainPlan/browser-os-north-star/benchmarks/s3-jupyterlite-na-2026-07-15.json) | [N/A](../../mainPlan/browser-os-north-star/benchmarks/s3-marimo-wasm-na-2026-07-15.json) | pyproc `VirtualOrigin`/ASGI Service Worker URL contract. 같은 계약 후보가 없으면 N/A |
57-
| S4 machine resume | `bench:artifact --scenario S4` | 측정 필요 | 측정 필요 | 측정 필요 | 파일 이미지, persistence, resume hook 동등성 |
57+
| S4 machine resume | [측정됨](../../mainPlan/browser-os-north-star/benchmarks/s4-pyproc-2026-07-15.json) | [N/A](../../mainPlan/browser-os-north-star/benchmarks/s4-webvm-na-2026-07-15.json) | [N/A](../../mainPlan/browser-os-north-star/benchmarks/s4-jupyterlite-na-2026-07-15.json) | [N/A](../../mainPlan/browser-os-north-star/benchmarks/s4-marimo-wasm-na-2026-07-15.json) | signed `.pymachine`, trusted open, `resume.py` resource reopen. 같은 계약 후보가 없으면 N/A |
5858

5959
## 공개 문구 게이트
6060

docs/operations/testing.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ npm run bench:compare -- .tmp/pyproc-s3.json --out .tmp/s3-compare.md
131131
S4 machine resume는 설치 패키지 consumer gate의 signed `.pymachine` export/open/resume 값을 sample로 남긴다:
132132

133133
```bash
134-
npm run bench:artifact -- --scenario S4 --candidate pyproc --command "npm run test:consumer timings.machineExportMs/machineOpenMs/machineMB/machineResumeRows" --sample 80,2321,10.8,2,0 --sample 84,2260,10.8,2,0 --sample 82,2472,10.8,2,0 --out .tmp/pyproc-s4.json
134+
npm run bench:artifact -- --scenario S4 --candidate pyproc --command "npm run test:consumer timings.machineExportMs/machineOpenMs/machineMB/machineResumeRows" --sample 76,2264,10.8,2,0 --sample 75,2346,10.8,2,0 --sample 80,2136,10.8,2,0 --out .tmp/pyproc-s4.json
135135
npm run bench:compare -- .tmp/pyproc-s4.json --out .tmp/s4-compare.md
136136
```
137137

mainPlan/browser-os-north-star/03-progress-ledger.md

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2154,3 +2154,44 @@ NEXT:
21542154
1. S4 machine resume를 파일 이미지와 resume hook 기준으로 외부 후보 대비 봉인한다.
21552155
2. WebVM의 S1L 또는 Python shell 단일 계산 latency를 분리할 가치가 있는지 판정한다.
21562156
3. pyproc의 속도 간판은 S1 병렬 worker pool로 유지하고, README 속도 문구는 이 비교 계약을 통과한 숫자만 갱신한다.
2157+
2158+
## 2026-07-15 - S4 machine resume benchmark 축 고정
2159+
2160+
완료:
2161+
2162+
- `bench:artifact``bench:compare``S4` scenario를 받도록 확장했다.
2163+
- `npm run test:consumer`의 timing report에 `machineResumeRows`를 추가하고, `machineExportMs`를 key 생성/지문 계산과 분리한 signed image export 시간으로 좁혔다.
2164+
- [s4-pyproc-2026-07-15.json](benchmarks/s4-pyproc-2026-07-15.json)을 생성했다.
2165+
- [s4-webvm-na-2026-07-15.json](benchmarks/s4-webvm-na-2026-07-15.json), [s4-jupyterlite-na-2026-07-15.json](benchmarks/s4-jupyterlite-na-2026-07-15.json), [s4-marimo-wasm-na-2026-07-15.json](benchmarks/s4-marimo-wasm-na-2026-07-15.json)을 생성했다.
2166+
- [s4-compare-2026-07-15.md](benchmarks/s4-compare-2026-07-15.md)를 생성했다.
2167+
- [06-speed-comparison.md](06-speed-comparison.md), [benchmarking.md](../../docs/operations/benchmarking.md), [testing.md](../../docs/operations/testing.md)의 S4 상태를 갱신했다.
2168+
2169+
실측:
2170+
2171+
- Browser: Edge `150.0.4078.65`.
2172+
- S4 작업: `npm run test:consumer`의 설치 패키지 consumer gate. `bootSession`, `/home/web/resume.py`, SQLite resource, signed `.pymachine` export, trusted public key `openMachine`, `resume.py` 재실행과 row count 확인.
2173+
- 측정값은 `timings.machineExportMs`, `timings.machineOpenMs`, `timings.machineMB`, `timings.machineResumeRows`에서 가져왔다.
2174+
- 유효 sample: `(export 76ms, open 2264ms, image 10.8MB, rows 2)`, `(export 75ms, open 2346ms, image 10.8MB, rows 2)`, `(export 80ms, open 2136ms, image 10.8MB, rows 2)`.
2175+
- pyproc S4 median: export 76ms, open 2264ms, image 10.8MB, resume rows 2-2, maxErr 0.
2176+
- artifact 생성 commit: `a50d997f65d32765cb2d8e8d078babb9e99b613e`, `worktreeDirty: false`.
2177+
- 외부 후보 N/A artifact 생성 commit: WebVM `a55cff66`, JupyterLite `7eadfeb4`, marimo WASM `3cb223e7`. 모두 `worktreeDirty: false`.
2178+
2179+
검증:
2180+
2181+
- `npm test` PASS, 644 passed, 0 failed.
2182+
- `npm run test:consumer` GREEN 15/15 유효 3회.
2183+
- `npm run bench:artifact -- --scenario S4 --candidate pyproc --browser-version 150.0.4078.65 --engine "Pyodide + signed .pymachine" --source "npm run test:consumer" --command "npm run test:consumer, collect timings.machineExportMs/machineOpenMs/machineMB/machineResumeRows from installed package signed .pymachine gate" --note "derived from three installed package consumer gate runs; each run uses npm pack temp app, fresh headless Edge profile, signed exportImage includeHome, trusted public key openMachine, and resume.py SQLite resource reopen" --sample 76,2264,10.8,2,0 --sample 75,2346,10.8,2,0 --sample 80,2136,10.8,2,0 --out mainPlan/browser-os-north-star/benchmarks/s4-pyproc-2026-07-15.json` PASS.
2184+
- `npm run bench:compare -- mainPlan/browser-os-north-star/benchmarks/s4-pyproc-2026-07-15.json mainPlan/browser-os-north-star/benchmarks/s4-webvm-na-2026-07-15.json mainPlan/browser-os-north-star/benchmarks/s4-jupyterlite-na-2026-07-15.json mainPlan/browser-os-north-star/benchmarks/s4-marimo-wasm-na-2026-07-15.json --out mainPlan/browser-os-north-star/benchmarks/s4-compare-2026-07-15.md` PASS.
2185+
2186+
판정:
2187+
2188+
- S4는 pyproc의 “브라우저 안 machine image” 차별화 축이다. 단순 파일 저장이 아니라 signer trust, `/home/web`, `resume.py`, SQLite connection 재개설까지 product consumer gate에서 묶인다.
2189+
- pyproc 기준 S4는 signed `.pymachine` export median 76ms, trusted open median 2264ms, image 10.8MB, resume rows 2-2다.
2190+
- WebVM, JupyterLite, marimo WASM은 0점 처리하지 않고 N/A로 봉인했다. 이유는 같은 pyproc signed `.pymachine`/trusted open/`resume.py` resource reopen contract를 제공하는 후보로 측정하지 않았기 때문이다.
2191+
- S0-S4까지 속도 비교의 기본 축이 닫혔다. pyproc의 공개 속도 간판은 여전히 S1 병렬 worker pool이고, OS 차별화 증거는 S2 process map, S3 browser server, S4 machine resume다.
2192+
2193+
NEXT:
2194+
2195+
1. WebVM의 S1L 또는 Python shell 단일 계산 latency를 분리할 가치가 있는지 판정한다.
2196+
2. README benchmark 섹션에 S0-S4를 모두 올릴 경우, 숫자보다 계약 차이를 먼저 설명한다.
2197+
3. 다음 구조 강화는 benchmark artifact schema v2 또는 product-facing capability matrix 중 하나로 잡는다.

mainPlan/browser-os-north-star/06-speed-comparison.md

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# 06. 속도 정면 비교 계약
22

3-
상태: pyproc S0/S1/S2/S3 기준 artifact 기록. S0와 S0C는 pyproc, WebVM, JupyterLite, marimo WASM을 같은 표에 합쳤다. WebVM, JupyterLite, marimo WASM은 같은 S1, S2, S3 계약을 N/A artifact로 봉인. S1L은 pyproc, JupyterLite, marimo WASM을 같은 브라우저에서 측정.
3+
상태: pyproc S0/S1/S2/S3/S4 기준 artifact 기록. S0와 S0C는 pyproc, WebVM, JupyterLite, marimo WASM을 같은 표에 합쳤다. WebVM, JupyterLite, marimo WASM은 같은 S1, S2, S3, S4 계약을 N/A artifact로 봉인. S1L은 pyproc, JupyterLite, marimo WASM을 같은 브라우저에서 측정.
44

55
## 목표
66

@@ -48,6 +48,8 @@
4848
| 2026-07-15 | S2 external candidates | [webvm N/A](benchmarks/s2-webvm-na-2026-07-15.json), [jupyterlite N/A](benchmarks/s2-jupyterlite-na-2026-07-15.json), [marimo-wasm N/A](benchmarks/s2-marimo-wasm-na-2026-07-15.json) | [s2-compare-2026-07-15.md](benchmarks/s2-compare-2026-07-15.md) | 같은 `PyProc.map` process pool API 계약 없음 |
4949
| 2026-07-15 | S3 pyproc | [s3-pyproc-2026-07-15.json](benchmarks/s3-pyproc-2026-07-15.json) | [s3-compare-2026-07-15.md](benchmarks/s3-compare-2026-07-15.md) | GREEN, 3 samples, `VirtualOrigin` POST roundtrip median 18ms, p95 18ms, maxErr 0 |
5050
| 2026-07-15 | S3 external candidates | [webvm N/A](benchmarks/s3-webvm-na-2026-07-15.json), [jupyterlite N/A](benchmarks/s3-jupyterlite-na-2026-07-15.json), [marimo-wasm N/A](benchmarks/s3-marimo-wasm-na-2026-07-15.json) | [s3-compare-2026-07-15.md](benchmarks/s3-compare-2026-07-15.md) | 같은 pyproc `VirtualOrigin`/ASGI Service Worker URL contract 없음 |
51+
| 2026-07-15 | S4 pyproc | [s4-pyproc-2026-07-15.json](benchmarks/s4-pyproc-2026-07-15.json) | [s4-compare-2026-07-15.md](benchmarks/s4-compare-2026-07-15.md) | GREEN, 3 samples, signed `.pymachine` export median 76ms, open median 2264ms, image 10.8MB, resume rows 2-2 |
52+
| 2026-07-15 | S4 external candidates | [webvm N/A](benchmarks/s4-webvm-na-2026-07-15.json), [jupyterlite N/A](benchmarks/s4-jupyterlite-na-2026-07-15.json), [marimo-wasm N/A](benchmarks/s4-marimo-wasm-na-2026-07-15.json) | [s4-compare-2026-07-15.md](benchmarks/s4-compare-2026-07-15.md) | 같은 pyproc signed `.pymachine`/trusted open/`resume.py` resource reopen contract 없음 |
5153

5254
## 외부 비교 matrix
5355

@@ -61,7 +63,7 @@
6163
| S1L single-kernel numpy latency | [artifact](benchmarks/s1l-pyproc-2026-07-15.json) | 미측정 | [artifact](benchmarks/s1l-jupyterlite-2026-07-15.json) | [artifact](benchmarks/s1l-marimo-wasm-2026-07-15.json) | WebVM 제외 3자 측정 완료 |
6264
| S2 process map | [artifact](benchmarks/s2-pyproc-2026-07-15.json) | [N/A](benchmarks/s2-webvm-na-2026-07-15.json) | [N/A](benchmarks/s2-jupyterlite-na-2026-07-15.json) | [N/A](benchmarks/s2-marimo-wasm-na-2026-07-15.json) | pyproc serial 73ms, process pool 43ms, median speedup 1.61x. 외부 후보는 같은 `PyProc.map` process pool API 계약 없음 |
6365
| S3 browser server | [artifact](benchmarks/s3-pyproc-2026-07-15.json) | [N/A](benchmarks/s3-webvm-na-2026-07-15.json) | [N/A](benchmarks/s3-jupyterlite-na-2026-07-15.json) | [N/A](benchmarks/s3-marimo-wasm-na-2026-07-15.json) | pyproc `VirtualOrigin` POST roundtrip median 18ms, p95 18ms. 외부 후보는 같은 pyproc `VirtualOrigin`/ASGI Service Worker URL contract 없음 |
64-
| S4 machine resume | `npm run bench:artifact -- --scenario S4` | 미측정 | 미측정 | 미측정 | 보류 |
66+
| S4 machine resume | [artifact](benchmarks/s4-pyproc-2026-07-15.json) | [N/A](benchmarks/s4-webvm-na-2026-07-15.json) | [N/A](benchmarks/s4-jupyterlite-na-2026-07-15.json) | [N/A](benchmarks/s4-marimo-wasm-na-2026-07-15.json) | pyproc export 76ms, open 2264ms, image 10.8MB, resume rows 2-2. 외부 후보는 같은 pyproc signed `.pymachine`/trusted open/`resume.py` resource reopen contract 없음 |
6567

6668
`bench:speed`의 기본 S1 조건은 `workers=4`, `size=1024`, `samples=3`이다. 사람용 Speed Lab UI는 반응성을 위해 768 기본값을 쓰지만, runner는 URL query로 canonical 크기를 명시한다.
6769

@@ -112,7 +114,7 @@ npm run bench:compare -- .tmp/pyproc-s3.json .tmp/webvm-s3-na.json --out .tmp/s3
112114
S4 artifact는 `test:consumer`의 signed `.pymachine` timing을 machine resume sample로 승격한다. 설치 패키지 public import, signed export, trusted public key open, `/home/web/resume.py` 재개설, SQLite row 증가가 모두 통과한 값만 받는다.
113115

114116
```bash
115-
npm run bench:artifact -- --scenario S4 --candidate pyproc --command "npm run test:consumer timings.machineExportMs/machineOpenMs/machineMB/machineResumeRows" --sample 80,2321,10.8,2,0 --sample 84,2260,10.8,2,0 --sample 82,2472,10.8,2,0 --out .tmp/pyproc-s4.json
117+
npm run bench:artifact -- --scenario S4 --candidate pyproc --command "npm run test:consumer timings.machineExportMs/machineOpenMs/machineMB/machineResumeRows" --sample 76,2264,10.8,2,0 --sample 75,2346,10.8,2,0 --sample 80,2136,10.8,2,0 --out .tmp/pyproc-s4.json
116118
npm run bench:artifact -- --scenario S4 --candidate webvm --na "S4 signed .pymachine image and resume.py resource reopen contract 없음" --out .tmp/webvm-s4-na.json
117119
npm run bench:compare -- .tmp/pyproc-s4.json .tmp/webvm-s4-na.json --out .tmp/s4-compare.md
118120
```
@@ -127,6 +129,6 @@ npm run bench:compare -- .tmp/pyproc-s4.json .tmp/webvm-s4-na.json --out .tmp/s4
127129

128130
## 다음 작업
129131

130-
1. S4 machine resume를 파일 이미지와 resume hook 기준으로 외부 후보 대비 봉인한다.
131-
2. WebVM의 S1L 또는 Python shell 단일 계산 latency를 분리할 가치가 있는지 판정한다.
132-
3. pyproc의 속도 간판은 S1 병렬 worker pool로 유지하고, README 속도 문구는 이 비교 계약을 통과한 숫자만 갱신한다.
132+
1. WebVM의 S1L 또는 Python shell 단일 계산 latency를 분리할 가치가 있는지 판정한다.
133+
2. pyproc의 속도 간판은 S1 병렬 worker pool로 유지하고, README 속도 문구는 이 비교 계약을 통과한 숫자만 갱신한다.
134+
3. S0-S4 비교 축을 제품 README에 올릴 경우 숫자보다 계약 차이를 먼저 설명한다.
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
| candidate | ok | samples | export median ms | export p95 ms | open median ms | open p95 ms | image MB median | resume rows | maxErr | browser | commit | source |
2+
|---|---:|---:|---:|---:|---:|---:|---:|---|---:|---|---|---|
3+
| pyproc | GREEN | 3 | 76 | 80 | 2264 | 2346 | 10.8 | 2-2 | 0 | 150.0.4078.65 | a50d997f | mainPlan\browser-os-north-star\benchmarks\s4-pyproc-2026-07-15.json |
4+
| webvm | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | a55cff66 | S4는 pyproc signed .pymachine image, trusted public key open, /home/web/resume.py resource reopen 계약이다. WebVM은 이 pyproc machine resume contract를 제공하는 후보로 측정하지 않는다. |
5+
| jupyterlite | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | 7eadfeb4 | S4는 pyproc signed .pymachine image, trusted public key open, /home/web/resume.py resource reopen 계약이다. JupyterLite는 이 pyproc machine resume contract를 제공하는 후보로 측정하지 않는다. |
6+
| marimo-wasm | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | N/A | 3cb223e7 | S4는 pyproc signed .pymachine image, trusted public key open, /home/web/resume.py resource reopen 계약이다. marimo WASM은 이 pyproc machine resume contract를 제공하는 후보로 측정하지 않는다. |

0 commit comments

Comments
 (0)