Skip to content

Commit e67e948

Browse files
committed
Record sync staging in the handoff
1 parent 8b4c7c6 commit e67e948

1 file changed

Lines changed: 57 additions & 3 deletions

File tree

now.md

Lines changed: 57 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,64 @@ The living handoff for whoever owns fabric next (there was none before; keep thi
44
current). This records what is DONE, what is IN FLIGHT, and what is NEXT — the
55
things 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

1266
PR #188 merged at `931b77d`. It fixes issue #175, the rename that split a file
1367
into two names. A sync pass materialized its post-peer half with the disk view

0 commit comments

Comments
 (0)