Skip to content

Commit f89c3d8

Browse files
committed
릴리즈: 0.0.12 - 리플레이 경계 지문이 바뀌는 브레이킹 릴리즈
package.json과 lockfile을 0.0.12로 올리고 CHANGELOG의 Unreleased를 0.0.12 절로 연다. README 두 판과 패키지 계약과 릴리즈 문서의 설치 핀을 같은 값으로 옮겼고, api 레퍼런스에 rebaseLinear·rebaseTo·boundaryEpoch를 0.0.12 표식과 함께 적었다. 이 릴리즈의 브레이킹은 하나로 모인다: 페이지 해시 믹서가 레인마다 사슬 둘로 갈라지면서 h0 값이 바뀐다. 옛 저널과 이미지는 PYPROC_REPLAY_MISMATCH로 명시 거부되고, 이관은 이전 버전에서 export 후 업그레이드 후 open이거나 forget이다(CHANGELOG에 동사까지 적었다). 함께 나가는 것: 체크포인트 노드의 희소 해시 저장, /home의 파일 단위 내용주소 커밋(옛 v1 팩은 계속 읽힌다), Web Machine IndexedDB 스키마 v3와 blob 크기 색인, 선형 역사에서 메모리 한계가 실제로 걸리게 하는 rebaseLinear(기본 꺼짐). CHANGELOG 정정도 함께 한다: /home 항목이 이미 게시된 0.0.11 절에 잘못 들어가 있었다. 줄 끝이 CRLF와 LF로 섞여 앵커 탐색이 어긋난 것이 원인이라 파일 전체를 CRLF로 통일했다. 검증: npm test 3364 passed 0 failed, test:browser 129/129, test:installed 37/37, test:golden 8/8, test:types 0, test:package ok, test:contracts 7 suites.
1 parent 60daafa commit f89c3d8

8 files changed

Lines changed: 38 additions & 29 deletions

File tree

‎CHANGELOG.md‎

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,12 @@ happen only on an explicit maintainer decision; the Unreleased section accumulat
88

99
## Unreleased
1010

11+
<!-- unreleased-subpaths: -->
12+
소비자가 핀한 버전에 아직 없는 subpath 목록이다(위 주석이 기계 판독 정본). 출하 문서가 이 이름을
13+
예시로 쓰면 미출하 표식이 함께 있어야 하고, tests/contracts/publicSurface.mjs가 그것을 문다.
14+
15+
## 0.0.12 - 2026-08-03
16+
1117
### Breaking
1218

1319
- **The page-hash mixer splits each lane into two accumulator chains, so the replay boundary
@@ -31,6 +37,18 @@ happen only on an explicit maintainer decision; the Unreleased section accumulat
3137

3238
### Changed
3339

40+
- **`/home` is committed as one content-addressed blob per file.** It used to be concatenated into a
41+
single pack, so one changed byte in one file changed the pack's address and the whole tree was
42+
re-read, re-hashed, and re-written on every commit. Now an unchanged file is already in the store
43+
and costs no write at all: a commit that changed nothing under `/home` writes zero home blobs, and
44+
a commit that changed one file writes one. `journal.commit()` reports that as `home.wrote`, which
45+
is now a count rather than a boolean.
46+
47+
Older generations keep working - the v1 pack layout is still read, so upgrading does not lose a
48+
journal or an image. The **new** layout is not readable by older pyproc versions, so a
49+
`.pymachine` file exported after this change must be opened with this version or later; an older
50+
reader refuses it with `PYPROC_MACHINE_FORMAT_INVALID` rather than restoring a partial tree.
51+
3452
- **The Web Machine IndexedDB schema is now version 3, with a blob size index.** Asking how much a
3553
store holds - `inspectStorage()`, and every recovery-window plan - used to require deserializing
3654
every blob value just to read its length, so the question cost a full read of the database. Sizes
@@ -76,9 +94,7 @@ happen only on an explicit maintainer decision; the Unreleased section accumulat
7694
started by `history.watch()`, so the interval no longer holds the runtime and the reactive
7795
controller for the life of the tab.
7896

79-
<!-- unreleased-subpaths: -->
80-
소비자가 핀한 버전에 아직 없는 subpath 목록이다(위 주석이 기계 판독 정본). 출하 문서가 이 이름을
81-
예시로 쓰면 미출하 표식이 함께 있어야 하고, tests/contracts/publicSurface.mjs가 그것을 문다.
97+
한국어 요약: 리플레이 경계 지문(h0)이 바뀌는 브레이킹 릴리즈다. 페이지 해시 믹서가 레인마다 사슬 둘로 갈라지고, 체크포인트 노드는 바뀐 페이지의 해시만 담고, `/home`은 파일마다 내용주소 blob 하나로 커밋되고, Web Machine IndexedDB는 스키마 v3에 blob 크기 색인을 갖는다. 옛 저널과 이미지는 `PYPROC_REPLAY_MISMATCH`로 명시 거부되므로, 지키려는 상태는 이전 버전에서 `history.export()`로 내보낸 뒤 업그레이드하고 `open()`한다. 크래시 복구 캐시일 뿐인 저널은 `history.forget()`으로 버린다. `setRetentionPolicy({ rebaseLinear: true })`는 선형 역사에서 메모리 한계가 실제로 걸리게 하는 새 옵션이고, 경계를 옮기는 대가 때문에 기본값은 꺼짐이다.
8298

8399
## 0.0.11 - 2026-08-02
84100

@@ -125,19 +141,6 @@ Users upgrading directly from 0.0.9 must also apply the 0.0.10 migration from ro
125141

126142
### Changed
127143

128-
- **`/home` is committed as one content-addressed blob per file.** It used to be concatenated into a
129-
single pack, so one changed byte in one file changed the pack's address and the whole tree was
130-
re-read, re-hashed, and re-written on every commit. Now an unchanged file is already in the store
131-
and costs no write at all: a commit that changed nothing under `/home` writes zero home blobs, and
132-
a commit that changed one file writes one. `journal.commit()` reports that as `home.wrote`, which
133-
is now a count rather than a boolean.
134-
135-
Older generations keep working - the v1 pack layout is still read, so upgrading does not lose a
136-
journal or an image. The **new** layout is not readable by older pyproc versions, so a
137-
`.pymachine` file exported after this change must be opened with this version or later; an older
138-
reader refuses it with `PYPROC_MACHINE_FORMAT_INVALID` rather than restoring a partial tree.
139-
140-
141144
- Durable RPC now has one normative retry boundary. A direct durable controller may resend the same
142145
request id once only when it can prove a proxy-free session. A normal follower, a live timeout,
143146
a vanished caller, or an unportable heap returns non-retryable `PYPROC_RPC_OUTCOME_UNKNOWN`

‎README.ko.md‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ fail-closed network policy를 적용하면 선택한 데이터도 code 실행
153153
## 빠른 시작
154154

155155
```sh
156-
npm install pyproc@0.0.11 --save-exact
156+
npm install pyproc@0.0.12 --save-exact
157157
npx pyproc-engine --out public/vendor/pyodide
158158
```
159159

@@ -484,11 +484,11 @@ export default { server: { headers: {
484484

485485
## 설치와 핀
486486

487-
npm([npmjs.com/package/pyproc](https://www.npmjs.com/package/pyproc)): `npm install pyproc@0.0.11 --save-exact`. 빌드 단계는 없다(네이티브 ESM). 플로팅 범위(`^`, `~`, `latest`)는 지원하지 않는다. 상태 커널의 replay 보장은 버전에 묶여 있다:
487+
npm([npmjs.com/package/pyproc](https://www.npmjs.com/package/pyproc)): `npm install pyproc@0.0.12 --save-exact`. 빌드 단계는 없다(네이티브 ESM). 플로팅 범위(`^`, `~`, `latest`)는 지원하지 않는다. 상태 커널의 replay 보장은 버전에 묶여 있다:
488488

489489
```jsonc
490490
// package.json
491-
"dependencies": { "pyproc": "0.0.11" }
491+
"dependencies": { "pyproc": "0.0.12" }
492492
```
493493

494494
`pyproc/runtime`과 typed API subpath 항목은 0.0.11에 출하된다. 아직 릴리즈하지 않은 커밋을

‎README.md‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ restored. A fail-closed network policy can also keep selected data local while c
153153
## Quick start
154154

155155
```sh
156-
npm install pyproc@0.0.11 --save-exact
156+
npm install pyproc@0.0.12 --save-exact
157157
npx pyproc-engine --out public/vendor/pyodide
158158
```
159159

@@ -485,11 +485,11 @@ Can't set headers at all (e.g. GitHub Pages)? Register `pyprocSw.js?coi=1` and r
485485

486486
## Install and pinning
487487

488-
From npm ([npmjs.com/package/pyproc](https://www.npmjs.com/package/pyproc)): `npm install pyproc@0.0.11 --save-exact`. There is no build step (native ESM). Floating ranges (`^`, `~`, `latest`) are not supported because a state kernel's replay guarantee is version-bound:
488+
From npm ([npmjs.com/package/pyproc](https://www.npmjs.com/package/pyproc)): `npm install pyproc@0.0.12 --save-exact`. There is no build step (native ESM). Floating ranges (`^`, `~`, `latest`) are not supported because a state kernel's replay guarantee is version-bound:
489489

490490
```jsonc
491491
// package.json
492-
"dependencies": { "pyproc": "0.0.11" }
492+
"dependencies": { "pyproc": "0.0.12" }
493493
```
494494

495495
`pyproc/runtime` and the typed API subpath entries ship in 0.0.11. A SHA pin

‎docs/operations/release.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030

3131
## 설치 재현성
3232

33-
- 공식 설치 예제는 **npm 정확 버전**을 사용한다: `"pyproc": "0.0.11"`(+ 락파일). 플로팅(`^`/`~`/`latest`)은 재현 가능한 제품 입구가 아니므로 문서에 두지 않는다.
33+
- 공식 설치 예제는 **npm 정확 버전**을 사용한다: `"pyproc": "0.0.12"`(+ 락파일). 플로팅(`^`/`~`/`latest`)은 재현 가능한 제품 입구가 아니므로 문서에 두지 않는다.
3434
- 새 버전은 pyproc tarball 자체에서 npm 해석, 타입 검사, 워커 emit, 브라우저 부팅을 모두 통과해야 한다.
3535
- 버전이나 태그는 북극성 점수의 증거가 아니다. 제품 능력은 저장소의 실행 계약과 실패 게이트로만 판정한다.
3636

‎docs/reference/api.md‎

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -171,8 +171,14 @@ Volatile verbs:
171171
- `stats()` reports exact controller-owned base/delta/hash bytes, node/branch counts,
172172
live depth, and the last pressure event.
173173
- `setRetentionPolicy(policy)` sets observable budgets (`maxNodes`, `maxDeltaBytes`,
174-
`maxTotalBytes`). `pruneBranches: true` may remove only off-live-path branches;
175-
the live path is never silently dropped or rebased.
174+
`maxTotalBytes`). `pruneBranches: true` may remove only off-live-path branches, so a
175+
linear history - the shape a per-statement checkpoint produces - gets nothing back from
176+
it. `rebaseLinear: true` folds the live path into the base instead, which is what makes
177+
a budget hold there. It is off by default because folding moves the replay boundary:
178+
a journal or image written against the old one is refused with `PYPROC_REPLAY_MISMATCH`,
179+
and time travel before the new boundary with `PYPROC_CHECKPOINT_PRUNED`. Available from
180+
0.0.12, along with `rebaseTo(j)` for folding explicitly and `boundaryEpoch`, which counts
181+
boundary moves so a consumer caching the fingerprint can drop its cache.
176182

177183
Durable verbs (all take `{ dir }`, a `FileSystemDirectoryHandle`; the same `dir` shares
178184
one journal instance):

‎docs/usage/contract.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ The roles are split.
1414
```jsonc
1515
// package.json
1616
"dependencies": {
17-
"pyproc": "0.0.11"
17+
"pyproc": "0.0.12"
1818
}
1919
```
2020

‎package-lock.json‎

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎package.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "pyproc",
3-
"version": "0.0.11",
3+
"version": "0.0.12",
44
"description": "A persistent Python computer in the browser: real CPython, durable workspaces, processes, rewindable history, and signed machine images. No application server. (브라우저에 영속하는 Python 컴퓨터.)",
55
"type": "module",
66
"repository": {

0 commit comments

Comments
 (0)