Skip to content

Commit 12256e0

Browse files
jstar0claude
andcommitted
docs: release v0.4.0-beta.1
Record the release that makes periodic enrollment survive a real corpus, with the production numbers behind each claim and the limitations that remain: the capability is still fs-engine-preview, folding needs free space before it can reclaim any, and a pack build still rewrites the whole pack each cycle. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
1 parent 6d611d6 commit 12256e0

3 files changed

Lines changed: 134 additions & 5 deletions

File tree

‎CHANGELOG.md‎

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,55 @@ pre-1.0, so a minor version may contain compatibility changes.
66

77
## [Unreleased]
88

9+
## [0.4.0-beta.1] - 2026-09-13
10+
911
### Added
1012

13+
- Automatic batch sizing for periodic enrollment. A cycle rebuilds the whole
14+
pack whether it folds one session or two hundred, so the batch is derived
15+
from the rebuild and per-session costs the last cycles measured, keeping that
16+
fixed toll to about a quarter of the work. The Auto fold pane gains a
17+
"How many per pass" control for choosing a size directly; `batch_size: 0` in
18+
`<store>/enrollment/policy.json` is the automatic setting.
1119
- A Darwin-only controlled host-interruption canary for the native append
1220
journal. It arms only with explicit environment variables, persists a
1321
journal and partial JSONL tail on an isolated internal-volume fixture, and
1422
requires a changed boot identity before product startup recovery can pass.
1523

24+
### Fixed
25+
26+
- A staged canonical snapshot that already existed is reused when it is
27+
byte-identical to its source. Refusing it made a migration that failed after
28+
staging permanently unretryable, stranding folded sessions next to the
29+
originals they should have replaced.
30+
- A failed migration no longer skips reclamation. The pack build earlier in the
31+
same cycle has already written a new generation, so returning early left the
32+
store larger every cycle for as long as one session stayed stuck. Deleting a
33+
user's original still waits for a clean cycle.
34+
- Enrollment planning consults the batch limit before pricing a candidate
35+
against the storage budget. Each price is a full store scan, so pricing every
36+
candidate turned a sub-second plan into one that timed out, which the Host
37+
reported as nothing left to fold.
38+
- A cycle repacks once before the storage-health gate blocks it. A pack build
39+
refused for free space leaves manifests pointing at unpacked objects, and the
40+
gate then blocked every candidate without anything ever repacking.
41+
- The Host preserves policy fields it does not model. Writing a fixed batch size
42+
back reset a tuned batch whenever any switch in the pane was flipped.
43+
- A mount-table probe that exceeds its deadline is treated as inconclusive
44+
rather than as recovery, gated on the backend still answering. Status
45+
publication no longer waits on reconciliation, the steady-state probe runs
46+
once every five intervals, and mount-recovery polling backs off.
47+
- A status channel that stops advancing degrades the indicator instead of
48+
raising an incident, and escalates only once sustained. A component reporting
49+
failure still alerts at ten seconds.
50+
- Read-ahead extends its horizon only after a read advances into the adjacent
51+
block, so a lookup no longer pays for a scan it is not performing.
52+
1653
### Validation
1754

55+
- 205 sessions whose native originals had been retired were read back through
56+
the mount and compared against the SHA-256 recorded at retirement: 666 MB,
57+
byte-identical, every JSONL record parseable.
1858
- A real `reboot -q` interruption ran at the durable-journal / partial-tail
1959
checkpoint. On the next boot, automatic recovery restored the exact base
2060
SHA-256, rejected partial data, cleared the journal, and the independent
@@ -105,7 +145,8 @@ pre-1.0, so a minor version may contain compatibility changes.
105145

106146
- Initial local-first scan, fold, exact restore, and object-store release.
107147

108-
[Unreleased]: https://github.com/samekind/codexfold/compare/v0.3.0-beta.2...HEAD
148+
[Unreleased]: https://github.com/samekind/codexfold/compare/v0.4.0-beta.1...HEAD
149+
[0.4.0-beta.1]: https://github.com/samekind/codexfold/compare/v0.3.0-beta.2...v0.4.0-beta.1
109150
[0.3.0-beta.2]: https://github.com/samekind/codexfold/compare/v0.3.0-beta.1...v0.3.0-beta.2
110151
[0.3.0-beta.1]: https://github.com/samekind/codexfold/compare/v0.2.1...v0.3.0-beta.1
111152
[0.2.1]: https://github.com/samekind/codexfold/releases/tag/v0.2.1

‎README.md‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ It finds exact duplicate raw JSON string tokens, complete JSONL records, and con
1212
1313
## Current Status
1414

15-
`v0.3.0-beta.2` is the current `fs-engine-preview`. It adds bounded Pack V3 storage, verified loose-object and native-snapshot retirement, Pack-only recovery, and current-client regression evidence to the transparent filesystem introduced in `v0.3.0-beta.1`.
15+
`v0.4.0-beta.1` is the current `fs-engine-preview`. It makes periodic enrollment survive a real corpus: batches size themselves from measured cycle cost, a refused pack build or an unroutable session no longer leaves the store permanently unable to fold, and a slow mount probe is no longer reported as an outage. It builds on the bounded Pack V3 storage, verified loose-object and native-snapshot retirement, and Pack-only recovery introduced in `v0.3.0-beta.2`.
1616

1717
Client version and build identity are diagnostic metadata only. Unknown or newly updated Codex clients do not pause enrollment, change session routes, or force native materialization; runtime safety is enforced by writer probes, exact-byte verification, mount health, storage budgets, journal recovery, and filesystem semantics.
1818

@@ -43,11 +43,11 @@ See [the Linux FUSE3 validation](docs/validation-linux-fuse3.md) and [the macOS
4343
Install the versioned preview with Go:
4444

4545
```bash
46-
go install github.com/samekind/codexfold/cmd/codexfold@v0.3.0-beta.2
46+
go install github.com/samekind/codexfold/cmd/codexfold@v0.4.0-beta.1
4747
codexfold --version
4848
```
4949

50-
The [GitHub Release](https://github.com/samekind/codexfold/releases/tag/v0.3.0-beta.2) provides checksum-covered default CLI archives for macOS, Linux, and Windows on `amd64` and `arm64`. These archives expose the local storage and recovery command surface; they do not contain a generally signed macOS FSKit App.
50+
The [GitHub Release](https://github.com/samekind/codexfold/releases/tag/v0.4.0-beta.1) provides checksum-covered default CLI archives for macOS, Linux, and Windows on `amd64` and `arm64`. These archives expose the local storage and recovery command surface; they do not contain a generally signed macOS FSKit App.
5151

5252
The FSKit App under `platform/darwin/fskit` currently requires Xcode 27, XcodeGen, an eligible Apple development team, and source signing. The validated App uses a maintainer Apple Development identity and is neither Developer ID distributed nor notarized for general installation. Follow the [maintainer guide](docs/maintainer-guide.md) and use only an isolated Codex home until the product contract permits production promotion.
5353

@@ -174,4 +174,4 @@ codexfold gc --apply
174174
git diff --check
175175
```
176176

177-
See the [changelog](CHANGELOG.md), [v0.3.0-beta.2 release notes](docs/releases/v0.3.0-beta.2.md), [architecture](docs/design.md), [Fold V1 format](docs/fold-v1.md), [v0.2 validation](docs/validation-v0.2.md), [transparent filesystem product contract](docs/superpowers/specs/2026-07-11-transparent-session-filesystem-design.md), and [maintainer guide](docs/maintainer-guide.md).
177+
See the [changelog](CHANGELOG.md), [v0.4.0-beta.1 release notes](docs/releases/v0.4.0-beta.1.md), [architecture](docs/design.md), [Fold V1 format](docs/fold-v1.md), [v0.2 validation](docs/validation-v0.2.md), [transparent filesystem product contract](docs/superpowers/specs/2026-07-11-transparent-session-filesystem-design.md), and [maintainer guide](docs/maintainer-guide.md).

‎docs/releases/v0.4.0-beta.1.md‎

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
# CodexFold v0.4.0-beta.1
2+
3+
This prerelease makes periodic enrollment survive a real corpus. The previous
4+
preview could fold, but a single refusal anywhere in a cycle left the store
5+
unable to make progress again, and nothing recovered on its own. Folding a
6+
2,800-session store surfaced five separate ways to get permanently stuck, each
7+
of which silently blocked every later cycle.
8+
9+
## Highlights
10+
11+
- Batch size is measured rather than assumed. A cycle rebuilds the whole pack
12+
whether it folds one session or two hundred, so the batch is derived from the
13+
rebuild and per-session costs recent cycles measured, keeping that fixed toll
14+
to roughly a quarter of the work. The Auto fold pane gains a "How many per
15+
pass" control, and `batch_size: 0` in `<store>/enrollment/policy.json` selects
16+
the automatic setting.
17+
- A staged canonical snapshot that is byte-identical to its source is reused
18+
instead of refused, so a migration that failed after staging can be retried.
19+
- A failed migration no longer skips reclamation. Only deleting a user's
20+
original waits for a clean cycle.
21+
- Enrollment planning consults the batch limit before pricing a candidate
22+
against the storage budget, because each price is a full store scan.
23+
- A cycle repacks once before the storage-health gate blocks it, so a pack build
24+
refused for free space no longer locks enrollment permanently.
25+
- A mount-table probe that exceeds its deadline is inconclusive rather than an
26+
outage, gated on the backend still answering.
27+
- A status channel that stops advancing degrades the indicator and escalates
28+
only once sustained; a component reporting failure still alerts at ten
29+
seconds.
30+
- Read-ahead extends its horizon only after a read advances into the adjacent
31+
block.
32+
33+
## What Went Wrong Before
34+
35+
These are the behaviours this release removes, with the numbers the production
36+
store recorded.
37+
38+
- 237 sessions sat folded into the pack with their originals still on disk,
39+
because a staged snapshot could never be re-staged. That duplication was the
40+
884 MB behind a reported saving of zero.
41+
- One unroutable session stopped reclamation while the same cycle's pack build
42+
had already written a new generation, so the store grew every cycle.
43+
- Pricing every candidate against the storage budget took planning from 0.42s
44+
to over 200s, where it was killed. The Host reported nothing left to fold and
45+
stopped.
46+
- 12,776 mount probes exceeded their deadline and were reported as recovery,
47+
each surfacing as a "needs attention" alert that healed itself within half a
48+
minute. A measured `getfsstat` on the same machine returns in 68 µs at the
49+
median and 542 µs at p99; the deadline was missed because the probe goroutine
50+
was not scheduled, not because the filesystem was slow.
51+
52+
## Validation
53+
54+
- 205 sessions whose native originals had been retired were read back through
55+
the mount and compared against the SHA-256 recorded at retirement: 666 MB,
56+
byte-identical, every JSONL record still parseable. The originals no longer
57+
exist, so the recorded digest is the only reference.
58+
- A real `pack build` over the production store compressed 748.50 MiB of raw
59+
session bytes into 400.35 MiB.
60+
- `fs retire-native --apply` on a live session reclaimed 98% of the original
61+
file while the mount continued to serve the exact same bytes and size.
62+
- A real `reboot -q` interruption ran at the durable-journal / partial-tail
63+
checkpoint. On the next boot, automatic recovery restored the exact base
64+
SHA-256, rejected partial data, cleared the journal, and the independent
65+
Pack-only FSKit canary returned to 11 healthy doctor components with its
66+
256 MiB fixture unchanged.
67+
68+
## Known Limitations
69+
70+
- The public capability remains `fs-engine-preview`. Automatic updates are
71+
still refused before platform production readiness, and promotion is
72+
explicit.
73+
- Folding needs free space before it can reclaim any: a pack build is refused
74+
by the free-space reserve on a nearly full volume, and large sessions report
75+
`insufficient-storage-budget` until earlier ones free room.
76+
- `pack build` rewrites the whole pack each cycle. Batch sizing amortises that
77+
cost; it does not remove it.
78+
79+
## Install the CLI
80+
81+
```sh
82+
go install github.com/samekind/codexfold/cmd/codexfold@v0.4.0-beta.1
83+
```
84+
85+
The GitHub Release provides checksum-covered default CLI archives for macOS,
86+
Linux, and Windows on `amd64` and `arm64`. These archives expose the local
87+
storage and recovery command surface; they do not contain a generally signed
88+
macOS FSKit App.

0 commit comments

Comments
 (0)