@@ -4,10 +4,64 @@ The living handoff for whoever owns fabric next (there was none before; keep thi
44current). This records what is DONE, what is IN FLIGHT, and what is NEXT — the
55things the repo history alone does not carry.
66
7- _ Last updated: 2026-09-05 by Silber.fabric-codex. The latest code merge is
8- ` 931b77d ` , pull request #188 ._
7+ _ Last updated: 2026-09-06 by Silber.fabric-codex. The latest code merge is
8+ ` 8b4c7c6 ` , pull request #189 ._
9+
10+ ## Latest handoff — 2026-09-06
11+
12+ PR #189 merged at ` 8b4c7c6 ` . It adds staging to synced folders. Nathan said
13+ "Don't file an issue, get it fixed" about the gap Silber.catalog described: in a
14+ synced folder the write is the publish, so a change had no state in which it
15+ existed, was complete, and had not been distributed, and nothing could be
16+ reviewed before it crossed.
17+
18+ The mechanism. A staged file lives at ` <fabric home>/staging/<entry>/<rel> ` ,
19+ outside every synced folder. ` fabric sync stage <target> ` resolves the entry
20+ from the target path and the include globs, seeds the staged copy from the
21+ published file or ` --from ` , prints the path to edit, and records the published
22+ file's hash as the base. ` fabric sync staged ` lists staged files as ` new ` ,
23+ ` edit ` , or ` stale ` . ` fabric sync publish ` hands the reviewed bytes to the
24+ daemon, which publishes under the entry operation guard: every base is checked
25+ against the live manifest before any write, each file is written through the
26+ engine write path with a journal receipt, then one scan, one persist, and one
27+ wake. A set is one reconcile on each peer, and a refused set changes nothing.
28+ ` --force ` publishes over a moved base. With no daemon, or an older one, the CLI
29+ writes each file atomically into the folder and says so. ` fabric sync discard `
30+ removes staged copies. ` fabric sync ls ` shows ` staged=N ` .
31+
32+ Why the tree is outside every root and not a prefix inside one. A daemon
33+ decides what to publish from exactly two things: the folder it walks and the
34+ include globs in its own ` syncs.toml ` . ` SyncEntry ` ignores unknown fields, so a
35+ new config key is dropped silently by an older build, and no engine state or
36+ control request reaches an older build's scan. A prefix inside the folder, an
37+ exclude a tool flips, or a per-path hold in engine state would all publish the
38+ staged bytes the moment a machine rolled back. A tree outside every folder is
39+ never walked by any build that has shipped. The old-binary guarantee comes from
40+ the folder walk, not from any new config an old binary would ignore. That
41+ sentence is the one to keep.
42+
43+ The proofs are in the pull request. Seven library tests over two loopback
44+ engines, written before the implementation and failing on it. One of them is
45+ the leak control ` the_leak_control_sees_a_file_placed_inside_the_folder ` : it
46+ places the same file inside the folder and is ` should_panic ` on the exact
47+ message, so the absence assertion is known to see a leak. If it ever passes,
48+ the staged-file test has stopped watching. One real-daemon test proves a staged
49+ file does not reach a peer while control files cross, survives a restart of the
50+ staging daemon, and arrives after publish. The installed ` 0.2.5+4dc0cac ` daemon
51+ ran in a temporary home over a staged file for 4 passes and 8 scans and
52+ recorded nothing, while the same bytes inside the folder published at once,
53+ 09:10:08Z to 09:10:18Z. Both temporary directories were removed.
54+
55+ Limits, stated. A multi-file publish is atomic per file, not across a crash;
56+ publish again to finish. A reviewer on another machine cannot see a staged
57+ file, by design; review happens on the staging machine at the printed path.
958
10- ## Latest handoff — 2026-09-05, late
59+ No release or deployment followed the merge. Silber.cos gates both, separately.
60+ Re-read the fleet build with ` fabric --version ` on Silber and
61+ ` fabric exec hetz -- fabric --version ` for Hetz before using any recorded value.
62+ No code job remains live from this work.
63+
64+ ## Earlier handoff — 2026-09-05, late
1165
1266PR #188 merged at ` 931b77d ` . It fixes issue #175 , the rename that split a file
1367into two names. A sync pass materialized its post-peer half with the disk view
0 commit comments