Skip to content

Commit 4f36f9e

Browse files
committed
기능: 브라우저 저장소 내구 경계를 제품화
persistent와 best-effort mode, 거친 usage 및 quota 관찰을 versioned receipt로 공개한다. OPFS와 IndexedDB quota 실패를 안정 code로 정규화하고 기존 상태와 HEAD를 보존한다. origin 밖 witness가 전체 OPFS 삭제를 첫 부팅이 아닌 명시적 축출로 판정한다. 문제: estimate 값은 쓰기 예약이 아니며 삭제된 bucket 내부만으로 축출 탐지와 복구를 할 수 없었다. 음성 시험: 256 KiB quota에서 4 MiB 쓰기는 실패하고 placeholder와 Machine HEAD가 남지 않았다. 검증: npm test 13/13, contracts 40, types, package, installed 34/34, browser 13/13. 검증: storage durability, Control 26/26, WebComputer 13/13, WebMachine 5/5가 GREEN이었다. 검증: skills, provenance, engine independence와 repoGraph가 GREEN이었다.
1 parent 7359eea commit 4f36f9e

31 files changed

Lines changed: 905 additions & 42 deletions

File tree

index.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ export type PyProcErrorCode =
3131
| "PYPROC_JOURNAL_IO"
3232
| "PYPROC_STATE_CORRUPT"
3333
| "PYPROC_STATE_FENCE_STALE"
34+
| "PYPROC_STORAGE_QUOTA_EXCEEDED"
35+
| "PYPROC_STORAGE_EVICTED"
3436
| "PYPROC_RPC_OUTCOME_UNKNOWN"
3537
| "PYPROC_LEADER_UNAVAILABLE"
3638
| "PYPROC_SPLIT_BRAIN"

mainPlan/9-agentComputerStandardReadiness/README.md

Lines changed: 39 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
|---|---|---|---|
1717
| agent 진입점 | 매우 강함, 장기 수명주기 검증은 계속 | exact install 뒤 package engine 자동 선택, effect-free doctor, 네 adapter의 같은 CPython 첫 결과가 공개 계약으로 완결 | M3 컴퓨팅 몸체 확대와 독립 구현 conformance |
1818
| 눈과 팔 | 매우 강함, 완성 아님, 북극성 9.5 | APX Situation, 20회 무잔류 수명주기, bounded action 수렴, 실제 hardware compute와 pixel 결과 영수증 | 두 번째 독립 hardware와 browser 구현의 visual conformance |
19-
| 비-agent 컴퓨팅 몸체 | 훌륭한 브라우저 컴퓨터, 로컬 OS 완전 대체는 아님, 북극성 8.7 | owned CPython, worker process, OPFS disk, checkpoint, Machine image, Python과 x86 guest gate, hardware GPU 결과 gate, source-pinned SIMD와 NumPy 2.5.1 data package | shared-memory thread, wasm 도구층, Node guest, 과학 패키지 폭, quota 축출 계약 |
19+
| 비-agent 컴퓨팅 몸체 | 훌륭한 브라우저 컴퓨터, 로컬 OS 완전 대체는 아님, 북극성 8.7 | owned CPython, worker process, OPFS disk, checkpoint, Machine image, Python과 x86 guest gate, hardware GPU 결과 gate, source-pinned SIMD와 NumPy 2.5.1 data package, quota 실패와 OPFS 축출의 명시적 계약 | wasm 도구층, Node guest, 과학 패키지 폭, 외부 사본 기반 축출 복구 |
2020
| 단독 자립성 | Python 기본과 data Machine은 높음, 전체 WebComputer는 미완성 | source-built CPython, stdlib, NumPy가 npm에 포함되고 기본 부팅과 package install의 제3자 요청은 0 | x86 emulator와 firmware의 독립 재현, 외부 hardware runner 등록, 브라우저 범위 확대 |
2121
| 웹 표준 후보 가능성 | 기반은 있음, 후보라고 부르기에는 이름 | WebAssembly, Worker, cross-origin isolation, bucket file system 같은 표준 기반 위에 제품 계약이 동작 | vendor-neutral specification, 독립 구현, WPT형 conformance, 공개 incubation과 wide review |
2222

@@ -123,7 +123,10 @@ implementation experience는 독립적이고 상호운용 가능한 구현, 저
123123
- 완료: `parallelProcesses.sharedMemoryThreads`의 현재 경계를 exact packed Control로 실측했다. 설치 엔진은
124124
`worker-processes` mode이고 Python shared-memory thread는 미지원이다. build lock, manifest,
125125
`machine.inspect()`와 실제 Python 실패가 같은 versioned capability를 보고한다.
126-
- 진행 중: `durableDisk.quotaEviction`, `localPythonParity.wasmToolLayer` 순서로 소진한다.
126+
- 완료: `durableDisk.quotaEviction`을 exact packed Control과 실제 OPFS에서 닫았다. best-effort와
127+
persistent mode, rough estimate, quota 실패 안전성, 외부 witness 기반 축출 탐지를 한 계약으로 봉인했다.
128+
- 진행 중: `localPythonParity.wasmToolLayer`를 소진한다. durable disk의 다음 ceiling은
129+
`evictionRecoveryCopy`다.
127130
- upstream이 열어 주는 thread와 dynamic linking은 capability detection과 exact failure로 받는다.
128131
- wasm 도구층을 먼저 넣고 Node guest는 같은 Machine lifecycle과 image 계약을 통과시킨다.
129132

@@ -456,8 +459,8 @@ implementation experience는 독립적이고 상호운용 가능한 구현, 저
456459
`sha256:698ca96aeb85d96e150045b46751cbd1bd7f22ee6167e088d5eedc044b35b099`다. 첫 실행의 255.8초 중
457460
240초는 probe가 승리한 Promise 뒤 패배한 timeout timer를 취소하지 않은 잔류였고, 이를 고친 같은
458461
시나리오는 24.1초에 종료됐다.
459-
- 다음 직렬 작업: `durableDisk.quotaEviction`을 실제 OPFS quota와 persistence 경계에서 음성 probe로
460-
고정한다. 임의 PyPI native wheel 지원은 dynamic linking 전까지 주장하지 않는다.
462+
- 후속 `durableDisk.quotaEviction`은 아래 10절에서 완료했다. 임의 PyPI native wheel 지원은 dynamic
463+
linking 전까지 주장하지 않는다.
461464

462465
## 9. 해결 판정: shared-memory thread capability boundary
463466

@@ -480,4 +483,35 @@ implementation experience는 독립적이고 상호운용 가능한 구현, 저
480483
- 안전 경계: 브라우저 host 제어 채널의 공유 버퍼는 Python heap 공유를 뜻하지 않는다. shared WASM memory,
481484
thread spawn import, 실제 Python thread join과 checkpoint quiescence가 같은 gate를 통과하기 전에는
482485
`shared-memory` mode를 선언하지 않는다.
483-
- 다음 직렬 작업: `durableDisk.quotaEviction`이다.
486+
- 다음 직렬 작업이었던 `durableDisk.quotaEviction`은 아래 10절에서 완료했다.
487+
488+
## 10. 해결 판정: browser storage quota와 OPFS 축출
489+
490+
- 첫 RED: exact packed Control과 Edge 151의 fresh origin은 `persisted=false`이고 OPFS sentinel 왕복에는
491+
성공했지만 제품에는 persistence mode, quota failure, cold-start eviction을 설명하는 계약이 없었다.
492+
첫 screenshot SHA-256은
493+
`1ab44fd1bac6228170a60f34fe0200830eafb4ab730771a49d9dbe3173fed575`다.
494+
- 첫 불일치: `navigator.storage.estimate()`는 usage 401 bytes, quota 10,737,418,641 bytes를 보고했지만
495+
같은 origin의 browser 제어 관찰은 quota 592,332,401,049 bytes였다. test control로 quota를 262,144
496+
bytes로 고정한 뒤 4 MiB OPFS 쓰기는 즉시 `QuotaExceededError`였다. estimate는 예약이나 사전 허가가
497+
아님을 실제 실패로 확인했다.
498+
- 제품 계약: `pyproc.storage-durability/1`이 persistent와 best-effort mode, rough estimate,
499+
`PYPROC_STORAGE_QUOTA_EXCEEDED`, `PYPROC_STORAGE_EVICTED`를 공개한다. persistence 요청은 명시 호출로만
500+
수행하고 quota 실패를 자동 재시도하지 않는다.
501+
- 실패 안전성: 내용 주소 object 쓰기가 quota로 실패하면 기존 sentinel과 witness는 그대로이고, 파일
502+
handle 생성 뒤 남을 수 있던 거짓 빈 object는 제거된다. 같은 정규화가 state OPFS store, kernel VFS,
503+
IndexedDB Machine store의 공개 실패 경계에 적용된다.
504+
- 축출 경계: origin 밖에 보관한 `pyproc.storage-eviction-witness/1` receipt가 있으면 OPFS 전체 삭제 뒤
505+
fresh root를 조용한 첫 부팅으로 보지 않고 `PYPROC_STORAGE_EVICTED`로 끝낸다. 지워진 bucket 안에는
506+
복구할 바이트가 남지 않으므로 local self recovery는 false이고 외부 Machine 사본이 필요하다.
507+
- 표준 근거: [WHATWG Storage Standard](https://storage.spec.whatwg.org/)는 default bucket을 best-effort로
508+
두고 storage pressure에서 통째로 제거할 수 있으며 persistent bucket은 origin 또는 사용자의 개입 없이
509+
제거하지 않는다고 정의한다. [Chrome DevTools Protocol Storage domain](https://chromedevtools.github.io/devtools-protocol/tot/Storage/)
510+
usage/quota 관찰, exact-origin quota override, storage clear는 제품 의존성이 아니라 음성 시험 control로만
511+
사용했다.
512+
- 제품 증거: `npm run test:storage-durability`이 exact tarball, 공개 `pyproc-control`, headed Edge,
513+
실 OPFS에서 quota 실패, placeholder 부재, 이전 상태 생존, 외부 witness 검증, 전체 OPFS 삭제 뒤 eviction을
514+
한 시나리오로 검증한다. 최종 922 x 920 screenshot은 직접 눈검수했으며 SHA-256은
515+
`a1f30604693daf312a5fdd4399b8c08a50555c8f9d96d991cc3d8361aecdfc8c`다.
516+
- 다음 직렬 작업: `localPythonParity.wasmToolLayer`다. durable disk 자체의 다음 ceiling은 외부 Machine
517+
사본을 witness에 묶어 전체 browser bucket 삭제 뒤 복원하는 `evictionRecoveryCopy`다.

mainPlan/README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@
1919

2020
현재 미완료 이니셔티브는 [9-agentComputerStandardReadiness](9-agentComputerStandardReadiness/README.md)다.
2121
M2의 hardware GPU 결과 oracle과 M3의 NumPy 2.5.1 static data profile, thread capability boundary까지
22-
완료했다. 다음은 `durableDisk.quotaEviction`부터 직렬로 이어간다.
22+
완료했다. browser storage quota와 OPFS 축출의 명시적 계약도 닫았다. 다음은
23+
`localPythonParity.wasmToolLayer`부터 직렬로 이어간다.
2324

2425
이 번호는 agent-computer 포트폴리오의 실행 순서다. North Star ceiling ladder의 기존 번호와 우선순위를
2526
대체하지 않는다.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@
118118
"test:action-convergence": "node tests/browser/actionConvergenceProduct.mjs",
119119
"test:hardware-visual-oracle": "node tests/browser/hardwareVisualOracleProduct.mjs",
120120
"test:browser": "node tests/browser/run.mjs",
121+
"test:storage-durability": "node tests/browser/storageDurabilityProduct.mjs",
121122
"test:examples": "node tests/browser/examples.mjs",
122123
"bench:speed": "node tests/browser/speedBench.mjs",
123124
"bench:artifact": "node tests/browser/benchArtifact.mjs",

scripts/browserControl/browserControlPolicy.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ export const BROWSER_CONTROL_COMMAND_RISKS = Object.freeze({
3838
"Runtime.enable": "read",
3939
"Runtime.getProperties": "read",
4040
"Runtime.releaseObject": "read",
41+
"Storage.getUsageAndQuota": "read",
4142
"DOM.focus": "mutate",
4243
"DOM.setAttributeValue": "mutate",
4344
"DOM.setFileInputFiles": "externalEffect",
@@ -58,6 +59,7 @@ export const BROWSER_CONTROL_COMMAND_RISKS = Object.freeze({
5859
"Runtime.callFunctionOn": "externalEffect",
5960
"Runtime.evaluate": "externalEffect",
6061
"Storage.clearDataForOrigin": "externalEffect",
62+
"Storage.overrideQuotaForOrigin": "externalEffect",
6163
});
6264

6365
export const BROWSER_CONTROL_DEFAULT_READ_METHODS = Object.freeze([
@@ -177,7 +179,13 @@ export class BrowserControlPolicy {
177179
const input = params && typeof params === "object" ? params : {};
178180
if (method === "Page.navigate") this._authorizeCommandUrl(input.url);
179181
if (method === "Fetch.continueRequest" && input.url !== undefined) this._authorizeCommandUrl(input.url);
180-
if (method === "Storage.clearDataForOrigin") this._authorizeExactOrigin(input.origin);
182+
if (["Storage.clearDataForOrigin","Storage.getUsageAndQuota","Storage.overrideQuotaForOrigin"].includes(method)) {
183+
this._authorizeExactOrigin(input.origin);
184+
}
185+
if (method === "Storage.overrideQuotaForOrigin"
186+
&& (input.quotaSize !== undefined && (!Number.isSafeInteger(input.quotaSize) || input.quotaSize < 0))) {
187+
this._denyCommandTarget();
188+
}
181189
if (method === "Network.setCookie") {
182190
if (!input.url || input.domain) this._denyCommandTarget();
183191
this._authorizeCommandUrl(input.url);

scripts/engineIndependence/evidenceRegister.json

Lines changed: 74 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"schemaVersion": 1,
3-
"updatedAt": "2026-08-15",
3+
"updatedAt": "2026-08-16",
44
"recordPolicy": "PROVEN_LOCAL entries are immutable measurement snapshots. Commands and artifact paths inside those snapshots describe the observed run and can refer to retired research probes. Use currentProductGates for supported, runnable verification.",
55
"currentProductGates": [
66
{
@@ -27,6 +27,11 @@
2727
"path": "tests/packageGate.mjs",
2828
"lane": "packed artifact",
2929
"command": "npm run test:package"
30+
},
31+
{
32+
"path": "tests/browser/storageDurabilityProduct.mjs",
33+
"lane": "browser storage durability",
34+
"command": "npm run test:storage-durability"
3035
}
3136
],
3237
"evidence": [
@@ -937,6 +942,74 @@
937942
"retrievedAt": "2026-08-16",
938943
"claim": "the Preview 1 thread spawn proposal is Phase 1 and retained as a legacy path while future work moves to shared-everything threads"
939944
},
945+
{
946+
"evidenceId": "local-browser-storage-durability-20260816",
947+
"classification": "PROVEN_LOCAL",
948+
"environment": {
949+
"os": "Windows 11",
950+
"browser": "Microsoft Edge 151.0.4129.86",
951+
"node": "22.19.0",
952+
"control": "exact packed public pyproc-control",
953+
"storage": "real OPFS"
954+
},
955+
"commands": [
956+
"npm run test:storage-durability"
957+
],
958+
"result": "a forced quota failure returned one stable error, preserved prior OPFS state and the eviction witness, removed the new empty placeholder, and a total OPFS clear became an explicit eviction when checked against an external receipt",
959+
"measurements": {
960+
"persisted": false,
961+
"navigatorUsageBytes": 401,
962+
"navigatorQuotaBytes": 10737418641,
963+
"controlQuotaBeforeBytes": 592332401049,
964+
"forcedQuotaBytes": 262144,
965+
"attemptedWriteBytes": 4194304,
966+
"placeholderAfterFailure": false,
967+
"localSelfRecoveryAfterClear": false,
968+
"firstRedScreenshotSha256": "1ab44fd1bac6228170a60f34fe0200830eafb4ab730771a49d9dbe3173fed575",
969+
"finalScreenshotSha256": "a1f30604693daf312a5fdd4399b8c08a50555c8f9d96d991cc3d8361aecdfc8c",
970+
"finalScreenshotBytes": 104134,
971+
"viewport": "922x920"
972+
},
973+
"invariants": [
974+
"storage estimates are rough observations and never write reservations",
975+
"persistence is requested only by an explicit caller operation",
976+
"quota rejection is not retried automatically",
977+
"a failed new OPFS write leaves no false object while preserving prior data",
978+
"cold-start eviction detection requires a receipt held outside the origin",
979+
"deleted bytes require an external Machine copy for recovery",
980+
"browser debugging protocol methods are test controls and not runtime dependencies"
981+
],
982+
"artifacts": [
983+
{
984+
"role": "productGate",
985+
"file": "tests/browser/storageDurabilityProduct.mjs"
986+
},
987+
{
988+
"role": "firstRedProbe",
989+
"file": "tests/attempts/stateKernel/ownedStorageDurabilityProbe.mjs"
990+
},
991+
{
992+
"role": "browserGreenScreenshot",
993+
"viewport": "922x920",
994+
"byteLength": 104134,
995+
"sha256": "a1f30604693daf312a5fdd4399b8c08a50555c8f9d96d991cc3d8361aecdfc8c"
996+
}
997+
]
998+
},
999+
{
1000+
"evidenceId": "upstream-whatwg-storage-20260816",
1001+
"classification": "UPSTREAM_CONTRACT",
1002+
"url": "https://storage.spec.whatwg.org/",
1003+
"retrievedAt": "2026-08-16",
1004+
"claim": "default local buckets are best-effort, usage and quota are implementation-defined estimates, and storage pressure can clear a best-effort bucket as a unit"
1005+
},
1006+
{
1007+
"evidenceId": "upstream-cdp-storage-20260816",
1008+
"classification": "UPSTREAM_CONTRACT",
1009+
"url": "https://chromedevtools.github.io/devtools-protocol/tot/Storage/",
1010+
"retrievedAt": "2026-08-16",
1011+
"claim": "the Storage domain provides usage and quota observation plus experimental exact-origin quota override and data clearing used only as product test controls"
1012+
},
9401013
{
9411014
"evidenceId": "upstream-wasi-sdk-threads-20260816",
9421015
"classification": "UPSTREAM_CONTRACT",

skills/catalog.json

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
{
22
"format": "pyproc-skill-catalog",
33
"version": 1,
4-
"generatedFromDigest": "sha256:5d4c9baaed1223d534fabbbaac561a08e606a47f2f0f14a2e93db56272c1e0e1",
5-
"catalogDigest": "sha256:de9244f652c8b57bfa6df1985580122477e515d8f522c411ab61b29bd6716644",
4+
"generatedFromDigest": "sha256:35ed6163ebacbc2c52e6714e30768969ddee473af8ceae5b4d5db13204ae8e89",
5+
"catalogDigest": "sha256:ef928ed8844df7de08ea519e88b0aa2c48110efca893bb9eb4f40205c7a3231f",
66
"skills": [
77
{
88
"name": "automate-browser-with-pyproc",
@@ -314,8 +314,8 @@
314314
},
315315
{
316316
"path": "skills/evolve-pyproc/references/contract-reality.md",
317-
"bytes": 3043,
318-
"sha256": "sha256:eed3b62e60369482cae3aeeddb03f3dbdbe454c897e7c6e3f25713fa1f28a10d"
317+
"bytes": 3633,
318+
"sha256": "sha256:e3ae0e5a3a047c65d972019a7168a263567595f0f2687cfeecf910920cd5b7e8"
319319
},
320320
{
321321
"path": "skills/evolve-pyproc/references/experimental-freeze.md",
@@ -339,8 +339,8 @@
339339
},
340340
{
341341
"path": "skills/reference-pyproc-api/references/api.md",
342-
"bytes": 5087,
343-
"sha256": "sha256:35948b93f7cd21558937d284bdba0db85c4b892ec6456de44296f473e07ab9c3"
342+
"bytes": 5807,
343+
"sha256": "sha256:0f4bb86c9835dd856eed5525f8554e48aab8574900176f73494d39b7566558bb"
344344
},
345345
{
346346
"path": "skills/reference-pyproc-api/references/bundle-format.md",
@@ -419,8 +419,8 @@
419419
},
420420
{
421421
"path": "skills/use-pyproc-runtime/references/consumer-contract.md",
422-
"bytes": 3553,
423-
"sha256": "sha256:83b400fb57d0c913d3c1adef271f5e1a62d2f55296e6bae7edbdaf7726c3a0f6"
422+
"bytes": 4533,
423+
"sha256": "sha256:b953620955718c922c7a59642e8952510e62915fe23065c38cf3ee97f3ffd64d"
424424
},
425425
{
426426
"path": "skills/use-pyproc-runtime/references/hostcall-abi.md",
@@ -444,8 +444,8 @@
444444
},
445445
{
446446
"path": "skills/use-pyproc-runtime/references/platform-requirements.md",
447-
"bytes": 1252,
448-
"sha256": "sha256:d39788244948ae96c388407caea3370dd95d8981b8d4d552e79902414fde72d4"
447+
"bytes": 1898,
448+
"sha256": "sha256:26d8c923ec242e8a5931c1669b12b6cb72e6e5c7bf5aabc9d05924bf67bcee1e"
449449
},
450450
{
451451
"path": "skills/use-pyproc-runtime/references/value-envelope.md",

skills/evolve-pyproc/references/contract-reality.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
| Dynamic native wheels unsupported | pure Python wheel과 source-pinned package-owned facade 및 NumPy를 exact engine과 curated static native profile에 묶어 install 전에 검증한다 | profile 확대는 source build, oracle, reproducibility와 size gate가 있어야 하며 임의 binary wheel은 dynamic linking 전까지 받지 않는다 |
99
| Scientific package reach incomplete | 별도 `data-3` engine과 multi-wheel catalog가 실제 `wasm-simd128` float64 oracle과 source-built NumPy 2.5.1의 array, dot, FFT, linalg, seeded random을 실행한다. package clone과 Machine image도 같은 layer를 복원한다 | SciPy, pandas, Polars는 명시적 미포함이다. C++ exception 비활성과 allocation 또는 PocketFFT invariant 위반 abort 경계를 유지한 채 source-pinned profile을 하나씩 넓힌다 |
1010
| Python shared-memory thread unavailable | exact core와 data engine manifest가 `pyproc.thread-capability/1``worker-processes` mode를 선언한다. build가 `pthread-stubs`, 비공유 WASM memory, thread spawn import 부재를 직접 검증하고 `machine.inspect()``RuntimeError: can't start new thread` 경계를 그대로 보고한다 | [WASI SDK](https://github.com/WebAssembly/wasi-sdk)의 experimental thread target과 CPython pthread build만으로 browser host가 완성되지는 않는다. shared memory, spawn import, 실제 Python thread join, checkpoint quiescence가 같은 제품 gate를 통과할 때만 `shared-memory` mode로 바꾼다 |
11+
| Browser bucket total eviction cannot self-recover | `pyproc.storage-durability/1`이 best-effort와 persistent mode, rough estimate, 안정 quota failure를 밝힌다. origin 밖 witness가 있으면 OPFS 전체 삭제를 첫 부팅으로 위장하지 않고 명시적 eviction으로 판정한다 | [WHATWG Storage Standard](https://storage.spec.whatwg.org/)처럼 best-effort bucket은 storage pressure에서 통째로 제거될 수 있다. 지워진 bucket 스스로는 데이터를 복구할 수 없으므로 witness에 결속된 외부 Machine 사본의 restore 계약이 남았다 |
1112
| Web Machine x86 guest assets external | host contract와 digest-pinned asset preparation을 분리한다 | emulator와 firmware의 독립 재현 범위를 계속 넓힌다 |
1213
| Kernel Machine image integrity, not signature | digest가 engine identity와 checkpoint objects를 봉인한다 | 제품이 외부 발행자를 신뢰해야 할 때 signing policy를 별도 version으로 추가한다 |
1314
| Web Machine protocol standard readiness | 표준 WebAssembly, Worker, cross-origin isolation, bucket file system 위에서 pyproc 제품 계약이 동작한다 | [legacy WASI threads proposal](https://github.com/WebAssembly/wasi-threads)은 Phase 1이고 후속은 [shared-everything threads](https://github.com/WebAssembly/shared-everything-threads)에서 진행 중이다. vendor-neutral 명세, WPT형 conformance, 독립 구현과 공개 incubation 전에는 웹 표준이라고 주장하지 않는다 |

0 commit comments

Comments
 (0)