Repository navigation
Conversation
gunbc.fabric_m0_origin_filesystem produces the fabric M0 origin contract's answers (OriginPutOutcome, OriginFetchOutcome) from a directory tree on a host, so gunbc.fabric_m0_commit and gunbc.fabric_m0_completion judge it exactly as they judge the R2 origin: - keys are sequences of admitted directory-entry names; a SHA-256 content address is sha256/<2>/<2>/<hex>; - put: unique staging file, cp, fsync, mkdir, hard link (create-if-absent by construction), fsync the key's directory; a failed link is classified by a listing of that directory, never by ln's exit status; - fetch: walks the key's segments with listings, so absence is established only by a listing that succeeded; stages its own copy and reads it through read_origin_staged_file, the sole reading mint. OriginPutOutcome moves from gunbc.cloudflare.r2_origin_object to gunbc.fabric_m0_origin_readback beside OriginFetchOutcome: the shape is the interface's, and a second realization no longer imports a vendor to answer. extdeps.shell gains shell.Sync.Path (coreutils sync -- PATH, fsync of one named file or directory). Witnesses: fabric_m0_origin_filesystem 6/6 (hermetic), 6/6 wet against a real throwaway root (stored put reads back and satisfies readback_digest_verdict; same bytes twice already present; different bytes never replace an occupied key and fail the verdict; absent key with missing directories; root without objects/ unavailable, never absent; escaping key refused). Regression: cloudflare_r2_origin_object 14/14, fabric_m0_origin_commit 10/10, fabric_m0_commit 13/13, fabric_m0_completion 29/29. Mutation: reading an unlisted failed link as already present turns the link claim red. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Yb9agVcWYWzjhPsJ42XQAk
…tch, symlink refusal Review repairs on the filesystem realization of the fabric M0 origin: A. The realization creates no directory. Every directory a key passes through (objects/, intermediate segments) and staging/ must already be established by host convergence; otherwise put refuses and fetch is unavailable. Content keys are sha256/<hex> under one established directory, so the only directory fsynced after a link is the key's own, already-established parent. B. A fetch fsyncs the installed object and its directory before staging a read; if either fails the fetch is unavailable and no reading is minted, so an unknown put (link without directory fsync) is never laundered into a confirmation. A later fetch that stabilizes is the reconciliation. C. Every directory on a key's path is observed to be a real directory and not a symbolic link (test -d, and the new shell.Test.IsSymbolicLink = POSIX test -h) before any effect. The claim is stated at its grain: lexical traversal and symlinked components refuse; a link substituted between observation and effect is the host binding's obligation until a beneath-root resolution capability exists. D. put/fetch take key: NonEmptyStr; no placeholder key is ever minted. Witnesses: hermetic 8/8 (incl. unknown put + unstabilized fetch = undetermined, + stabilized fetch = satisfied); wet 8/8 (incl. staging present and objects absent refuses without founding objects/, never-established key directory unavailable and not created, symlinked sha256/ refuses with nothing landing outside). Regression: cloudflare_r2_origin_object 14/14, fabric_m0_origin_commit 10/10. Mutation: letting an unstabilized fetch read turns the laundering claim red. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Yb9agVcWYWzjhPsJ42XQAk
|
Addressed the HOLD at 96d1caa against head 46f1a40. A. No directory creation. Put and fetch require every directory on the key's path (objects/, intermediate segments) and staging/ to already be real directories; otherwise put refuses and fetch is unavailable. Content keys are now B. Fetch fsyncs the installed object and its directory before staging a read; failure is C. Each directory component is checked with D. Staging cleanup is now stated as best effort. Runs on a binary built from main fb0155b: hermetic 8/8, wet 8/8, cloudflare_r2_origin_object 14/14, fabric_m0_origin_commit 10/10. |
…fect Review follow-up on the remaining part of C. The origin root itself is now in the observed directory population for put and fetch, so a root that is a symbolic link refuses. A fetch observes the listed object leaf with OriginObjectLeafStanding (test -h, then test -f) before it syncs or copies it: a symbolic link or a non-regular file is OriginFetchUnavailable and no reading is minted, so bytes outside the origin tree can never satisfy a readback. Witnesses: hermetic 9/9 (adds leaf standing arms and the decision refusing a symlinked or non-regular leaf over a staged fixture); wet 10/10 (adds a root that is a symbolic link, put refused / fetch unavailable / nothing lands in the target tree; and a digest leaf symlinked to an outside file holding exactly the expected bytes, fetch unavailable and verdict undetermined). Mutation: skipping the leaf observation turns the symlinked-leaf control red while the positive control stays green. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Yb9agVcWYWzjhPsJ42XQAk
|
Addressed the remaining root/leaf portion of C at head af5ece6. The origin root is now in the observed directory population for put and fetch. A fetch observes the listed leaf with |
… lane Every function in fabric_m0_origin_filesystem_wet_witness_test writes into a throwaway temp directory it creates and removes, and mktemp has no hermetic arm - so under the hermetic envelope each one is planned and then never reaches its subject, which the floor reports as an unenrolled route gap rather than a verdict. The file is excluded from the discovery corpus and its ten identities are scheduled on the local-repo wet lane, where the floor runs each member wet and joins the observed terminals back at identity grain. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…a-filesystem-origin
|
CI state at Fixed here: the ten Two gates still refuse, and neither is repaired by this branch:
🤖 Generated with Claude Code |
|
Closing unmerged to wind down the session. Tracked in #11399 together with the 0B lane, since |
First lane of the blob-backed evidence store. It is a second realization of the existing fabric M0 origin contract, beside R2, over a host directory tree. It is not a new store vocabulary:
gunbc.fabric_m0_commitandgunbc.fabric_m0_completionjudge it exactly as they judge the R2 origin.What lands
gunbc.fabric_m0_origin_filesystem<root>/objects/<directories...>/<name>holds installed objects;<root>/staging/holds unique staging files. A content-addressed object is<root>/objects/sha256/<64-hex digest>.objects/, every intermediate key directory andstaging/must already be real, non-symlink directories created by host convergence. Otherwise put refuses and fetch is unavailable.key: NonEmptyStr.cp,sync), thenln, which is create-if-absent by construction, thensyncon the key's already-established directory.ln's exit status.read_origin_staged_file, the sole reading mint.OriginPutOutcomemoves fromgunbc.cloudflare.r2_origin_objectintogunbc.fabric_m0_origin_readback, besideOriginFetchOutcome.extdeps.shelladditions:shell.Sync.Path(coreutilssync -- PATH, an fsync of one named file or directory) andshell.Test.IsSymbolicLink(POSIXtest -h, not following the link).Stated limits
sha256sum.Not in this PR
Verification (by execution, binary built from main fb0155b)
fabric_m0_origin_filesystem_witness_test: 9/9 hermetic. Covers key admission, directory and leaf standing, link and listing decisions, fetch absence, and the unknown-put composition throughobject_readback_of_origin_putandreadback_digest_verdict: undetermined when unstabilized, satisfied when stabilized.fabric_m0_origin_filesystem_wet_witness_test: 10/10 against a real throwaway root.staging/present withobjects/absent: put refuses andobjects/is not founded;cloudflare_r2_origin_object14/14,fabric_m0_origin_commit10/10,fabric_m0_commit13/13,fabric_m0_completion29/29.🤖 Generated with Claude Code
https://claude.ai/code/session_01Yb9agVcWYWzjhPsJ42XQAk