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
open()을 OPFS 기반 KernelElection의 기본 진입점으로 바꿨다.
run과 세대 commit을 직렬화해 결과가 내구 세대에 들어간 뒤 응답한다.
commit 실패는 재실행을 막는 PYPROC_RPC_OUTCOME_UNKNOWN으로 닫는다.
기본 엔진 주소를 /vendor/pyodide/로 옮기고 SRI 검증을 기본 적용했다.
pyproc-engine CLI가 core 6개와 lock package 354개를 검증한다.
CI와 Pages도 같은 배포판을 준비하며 CDN은 명시 평가 경로만 남겼다.
README, 타입, 제품 원장, 설치 및 브라우저 게이트를 새 계약에 맞췄다.
음성 시험: autoCommit 반전과 잘못된 엔진 경로를 각 게이트가 차단했다.
검증: npm test, npm run test:types, npm run test:package
검증: test:browser, test:installed, test:golden, test:web-computer, test:examples
Copy file name to clipboardExpand all lines: docs/consuming/capabilityMatrix.md
+3-2Lines changed: 3 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -33,7 +33,8 @@ Rows that carry the Stable label are recorded here with their evidence. A Stable
33
33
| Python runtime (`boot`/`run`/`loadPackages`) | before 2026-07-15 | (a) browser gate always on, (b) surface frozen across many 0.0.x releases, (c) long soak with the gate continuously green, (d) documented |
34
34
| Deployment asset integrity | before 2026-07-15 | (a) browser plus install-tarball gates, (b) releases elapsed, (c) long soak with the gate continuously green, (d) documented |
35
35
36
-
Promotion waiting clock: reactive (checkpoint/restore), session (.pymachine), and machineJournal were
36
+
Promotion waiting clock: reactive (checkpoint/restore), session (.pymachine), machineJournal, and the
37
+
default durable Machine were
37
38
re-judged at v0.0.11. Their persistence, portability, and failure contracts changed in that release,
38
39
so v0.0.11 is the new reference point for release stability. Calling a lane Stable in the same
39
40
release that changes its boundary would erase the meaning of the label.
@@ -55,7 +56,7 @@ A runnable surface is an example a person opens, a browser gate, a probe, or a t
55
56
| Outbound sockets | Lets Python `socket`, `urllib`, and `http.client` reach an external host:port|`SocketBridge` (`pyproc/socket`) | Experimental | A WS-to-TCP relay, JSPI blocking recv, and product operation of that relay |[socket campaign](../../tests/attempts/socketBridge/README.md), [Python socket probe](../../tests/attempts/socketBridge/socketPyProbe.html)| socket bridge probes | Inbound sockets are a browser security wall. For HTTPS the relay handles TLS |
56
57
| Device filesystem | Exposes browser features as Python file paths |`machine.runtime.enableDeviceFs()` (`DeviceFs`) | Experimental | Explicit device injection, browser permissions, and a clear file-path policy |[installed-package browser gate](../../tests/browser/installedPackageGate.mjs), [device FS probe](../../tests/attempts/pythonMachine/deviceFsProbe.html), [machine campaign](../../tests/attempts/pythonMachine/README.md)|`npm run test:installed`, device FS probes | Only explicitly configured devices allowed by browser policy exist |
57
58
| GPU compute | Uploads f32 arrays to WebGPU and runs a GPU-resident linear algebra pipeline |`GpuCompute`, `GpuArray`, `GpuBridge` (`pyproc/gpu`) | Experimental | WebGPU, a windowed browser, a real GPU, and an f32 data path |[GPU campaign](../../tests/attempts/gpuCompute/README.md), [GPU tiled probe](../../tests/attempts/gpuCompute/gpuTiledProbe.html), [GPU Python probe](../../tests/attempts/gpuCompute/gpuPythonProbe.html)| GPU probes on real hardware | WGSL has no f64. Headless CI numbers are not evidence of product performance |
58
-
| Immortal Python Machine | Many tabs share one Python state, and execution continues from the last commit even after the leader tab is force-killed and after every tab closes | `open({ persistent })` (formerly `openPersistentMachine`) -> a `KernelElection` handle; the journal is the durable verb set on `machine.history` (`MachineJournal`) | Experimental | Web Locks, BroadcastChannel, OPFS, and the same origin. Using the SAB-based OS capabilities on top also needs `crossOriginIsolated` and JSPI | [immortal demo](../../examples/immortal.html), [kernel election probe](../../tests/attempts/pythonMachine/kernelElectionProbe.html), [installed-package browser gate](../../tests/browser/installedPackageGate.mjs), [golden workflow](../../tests/browser/goldenWorkflow.mjs) | `npm test` (the [election protocol] section: reject state machine, epoch fencing, outcome records, conditional resend, unsafe-heap refusal, served-cache idempotence, all with negative tests confirmed), `npm run test:installed`, `npm run test:golden` | Not a multi-user server. Recovery is to a completed commit boundary. The [durable RPC state table](contract.md#durable-rpc-state-table-normative) is the retry boundary: a normal follower cannot prove the leader heap portable, so a sent call cut off by failover is outcome-unknown and is not resent |
59
+
| Default durable Machine | Opens one named Python Machine across tabs and cold-reopens it after every tab closes | `open()` / `open({ name })` -> `KernelElection`; `run` auto-commits heap, `/home/web`, and forwarded outcome before settling | Beta | Web Locks, BroadcastChannel, OPFS, the verified same-origin engine distribution, and the same origin. SAB-based OS capabilities also need `crossOriginIsolated` and JSPI | [immortal demo](../../examples/immortal.html), [kernel election probe](../../tests/attempts/pythonMachine/kernelElectionProbe.html), [installed-package browser gate](../../tests/browser/installedPackageGate.mjs), [golden workflow](../../tests/browser/goldenWorkflow.mjs) | `npm test` (serialized run/commit, commit-failure outcome-unknown, election fencing and outcome records), `npm run test:installed` (argument-free open plus cold reopen without manual commit), `npm run test:golden` | Not a multi-user server. Recovery is to the last completed command generation. A normal follower cut off mid-command still cannot prove leader-heap portability, so the [durable RPC state table](contract.md#durable-rpc-state-table-normative) closes it as non-retryable outcome-unknown |
59
60
| Machine container and jobs | Starts a separate machine kernel inside a browser worker and offers job control |`machine.containers()` -> `MachineContainer`, `machine.jobs()` -> `JobControl` (a process-OS lane: it assumes the same replay pool as `machine.proc`) | Experimental |`crossOriginIsolated`, the worker graph, and an explicit process-lifecycle policy |[browser gate](../../tests/browser/gate.html) (the machine.jobs and machine.containers evidence checks), [installed-package browser gate](../../tests/browser/installedPackageGate.mjs), [machine container probe](../../tests/attempts/pythonMachine/machineContainerProbe.html), [job control probe](../../tests/attempts/pythonMachine/jobControlProbe.html), [pipe and shm probe](../../tests/attempts/pythonMachine/pipeShmProbe.html)|`npm run test:browser`, the MachineContainer and JobControl rows of `npm run test:installed`, process OS probes | Not a Linux container and not an OS scheduler. It is pyproc's browser-kernel isolation model |
60
61
| Guests on one wire | Two guests on one computer exchange real Ethernet frames instead of merely coexisting | The built-in `network` device of `createWebComputer` (a `MemoryEthernetSwitch`), the `pyprocNet` module inside the Python guest, and the frame law exported from `pyproc/machine`| Experimental |`createWebComputer` with `network` left on, and a guest that speaks frames |[guest network probe](../../tests/webMachine/browser/probes/guestNetworkProbe.html), [packet network probe](../../tests/webMachine/browser/probes/packetNetworkProbe.html)|`npm run test:web-machine` (the guest network probe runs in CI; the Linux crossing is in the local `--v86` lane) | Only ARP and ICMP echo are answered automatically; TCP, UDP, and DNS are the guest's own business. There is no uplink, so guests reach each other and nothing else. Both guests currently share one JS thread, so a frame arrives between `run()` calls rather than during one |
61
62
| Non-Pyodide engine seam | Proves the session and time-travel primitives work on non-Pyodide CPython 3.14 WASI |`bootWasi`, `WasiSession` (`pyproc/wasi`) | Research preview | A consumer-provided `wasmURL`, the WASI worker asset, and the JSON value bridge |[WASI browser gate](../../tests/browser/wasiGate.html), [engine port campaign](../../tests/attempts/enginePort/README.md), [WASI REPL probe](../../tests/attempts/enginePort/wasiReplProbe.html)| WASI gate, [dual engine probe](../../tests/webMachine/browser/probes/dualEngineProbe.html) in `npm run test:web-machine:wasi`| Not the production default engine. The value bridge is JSON-centric and C extensions need a static build |
Copy file name to clipboardExpand all lines: docs/consuming/compatibility.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -25,7 +25,7 @@ This table answers which pyproc surfaces can run in a target environment. The ru
25
25
26
26
## Engine
27
27
28
-
-**Pyodide v314.0.2 (CPython 3.14).** Loaded from a CDN by default, self-hostable through `indexURL`. Changing the version is a release-worthy event that requires the full runtime-consistency gate (detail: the runtime-consistency section of [contract.md](contract.md)).
28
+
-**Pyodide v314.0.2 (CPython 3.14).** Loaded from the verified same-origin `/vendor/pyodide/` distribution by default. `indexURL` is an explicit distribution override. Changing the version is a release-worthy event that requires the full runtime-consistency gate (detail: the runtime-consistency section of [contract.md](contract.md)).
29
29
- The WASI engine (`pyproc/wasi`) is a separate async surface for proving engine independence. Pyodide is the production canon.
30
30
31
31
## Resource characteristics (for sizing your heap)
0 commit comments