C mv:\smove\sthe\sworking\sfile\sfirst,\sthen\srecord\sthe\srename\s(blocker\sB4)\n\n`zit\smv`\srecorded\sthe\srename\sin\sthe\smanaged\sset\sand\spersisted\sit\sDURABLY\nbefore\sattempting\sthe\sfilesystem\smove,\sand\srolled\snothing\sback\swhen\sthe\smove\nfailed.\sEvery\sfailed\smv\stherefore\sleft\sthe\srepository\sin\sa\sstate\sthe\suser\nnever\sasked\sfor:\sthe\sset\snaming\sa\spath\sthat\sdoes\snot\sexist,\sthe\sfile\sstill\sat\nits\sold\sname,\s`status`\sreporting\sthe\snew\sname\sas\smissing,\sand\s`commit`\sready\nto\srecord\sa\srename\sthat\snever\shappened.\sThe\sdocumented\srecovery\sin\n`mv\s--help`\s--\s"to\sreverse\sa\srename,\srun\s`zit\smv\sNEW\sOLD`"\s--\sthen\sfailed\ntoo,\sbecause\sthe\sreverse\smv\ssees\sthe\sold\spath\sstill\soccupied\son\sdisk\sand\nrefuses\sthe\scollision.\sThe\shelp\stext\spromised\san\sescape\sthat\sthe\sordering\nmade\simpossible.\n\nWHAT\sCHANGED\n\n1.\s`mvCommit`\sis\sreordered:\srename\sthe\sworking\sfile\sFIRST,\sthen\sswap\sthe\n\s\s\smanaged\sentry\sand\spersist.\sIf\sthe\spersist\sfails,\sthe\sfile\sis\srenamed\sback\n\s\s\sand\snothing\sis\srecorded.\sThe\srecord/persist\shalf\sis\sextracted\sinto\n\s\s\s`mvRecord`,\swhich\sreturns\sthe\sfirst\sfailure's\sexit\swith\sits\sdiagnostic\n\s\s\salready\son\sstderr,\sleaving\s`mvCommit`\sto\sown\sonly\sthe\sordering\sand\sthe\n\s\s\srollback.\n\n\s\s\sMOVE-FIRST-WITH-ROLLBACK\sRATHER\sTHAN\sRECORD-FIRST-WITH-RECORD-ROLLBACK.\n\s\s\sUndoing\sa\sdurable\srecord\swrite\sneeds\sa\ssecond\sdurable\swrite,\swhich\scan\n\s\s\sitself\sfail,\snesting\sthe\sfailure\sinside\sthe\sfailure\shandler.\sRenaming\sa\n\s\s\sfile\sback\scannot\srealistically\sfail:\sthe\ssource\sdirectory\sthat\sexisted\sa\n\s\s\smoment\sago\sstill\sexists\sand\sthe\ssource\sname\sis\sstill\sfree.\sThe\srollback\n\s\s\sthat\scan't\sfail\sis\sthe\sone\sto\sbuild\sthe\sguarantee\son.\n\n2.\s`mvCheckLegal`\sgains\sa\sdest-parent-exists\scheck.\sThis\sis\swhat\sturns\sthe\n\s\s\sblocker's\sown\srepro\sinto\sa\sclean\srefusal\srather\sthan\sa\srollback:\sa\sstat\sof\n\s\s\sa\spath\sUNDER\sa\smissing\sdirectory\sfails,\sso\s`mvOnDisk(new_key)`\sreads\sfalse\n\s\s\sand\sthe\scollision\scheck\swaved\s`nodir/x.txt`\sthrough\s--\sthe\smost\scommon\sway\n\s\s\sa\slegal-looking\srename\sdies\sat\sthe\ssyscall\swas\sthe\sone\scase\sthe\sgauntlet\n\s\s\scould\snot\ssee.\sNow\sit\sis\srefused\spre-mutation,\snaming\sthe\sdirectory\sthe\n\s\s\suser\shas\sto\screate.\sThe\srollback\spath\sremains\slive\sand\sis\spinned\sby\sthe\n\s\s\sEACCES\stest,\swhere\sthe\sparent\sexists\sand\sonly\sthe\srename\sitself\sfails.\n\n3.\sThe\s`mvCommit`\sdoc\scomment\sand\s`mvRenameFail`\sboth\sencoded\sand\sjustified\n\s\s\sthe\sold\sordering;\sboth\sare\srewritten.\sThe\sresidual\sfailure\swindow\sis\n\s\s\sdocumented\sat\sthe\ssite\srather\sthan\spapered\sover:\sa\scrash\sBETWEEN\sthe\smove\n\s\s\sand\sthe\srecord\sleaves\sthe\sfile\sat\sNEW\swith\sthe\sset\sstill\snaming\sOLD,\swhich\n\s\s\s`status`\sshows\sas\sOLD\smissing\splus\sNEW\sas\san\sextra,\srecoverable\swith\n\s\s\s`zit\sadd\sNEW`\s+\s`zit\srm\sOLD`.\sFull\scrash-atomicity\sacross\sfilesystem\sand\n\s\s\srecord\sis\sworking-tree\scrash-consistency\swork\s(0.2\s/\sDST),\snot\sthis\n\s\s\shandler's\sjob.\sA\snew\s`mvRollbackFail`\scovers\sthe\sone\scase\sthat\scan\sstill\n\s\s\sleave\sthe\stree\schanged\s--\smove\ssucceeded,\srecord\sfailed,\smove-back\sfailed\n\s\s\s--\sand\sprints\swhere\sthe\sfile\sactually\sis\sso\sit\scan\sbe\smoved\sby\shand.\n\nRIDE-ALONG\sSF3,\sSCOPED\sTO\smv\s(BLOCKER-FIX-PLAN.md\ssection\s3)\n\nmv\srendered\sboth\sENOENT\sand\sEACCES\sas\s"input/output\serror",\swhich\ssent\susers\nlooking\sfor\sa\sdisk\sfault\swhen\sthe\sreal\scause\swas\sa\stypo\sor\sa\spermission\sbit.\nThe\srename\serror\sis\snow\scaptured\sand\sreported.\sThe\serror\sname\sis\sprinted\nas-is\srather\sthan\sthrough\sa\stranslation\stable:\sthe\sglobal\serrno-mapping\ssweep\nis\s0.2\swork,\sand\sgrowing\sa\sprivate\smapping\shere\swould\sbe\sthe\sthing\sthat\ssweep\nthen\shas\sto\sunpick.\s`nodir`\sreports\sthe\smissing\sdirectory\sby\sname;\s`ro/x.txt`\nreports\sAccessDenied.\n\nRED\sPROOF\s(no\sproduct\scode\schanged\suntil\sRED\swas\sproven;\smarker\n`//\sREGRESSION\sB4:`)\n\nThree\sof\sthe\sfour\se2e\scases\sfailed\sagainst\sa\sfresh\sbuild\sof\sthis\stree:\n\n\s\sa\sfailed\smv\sinto\sa\smissing\sdirectory\srecords\snothing\n\s\sa\sfailed\smv\sinto\san\sunwritable\sdirectory\srecords\snothing\n\s\sa\sfailed\smv\sleaves\sthe\ssource\stracked\sand\sstill\smovable\n\nThe\sfirst\stwo\sfailed\son\s`indexOf(stderr,\s"recorded")\s==\snull`\s--\smv\sreporting\na\shalf-done\srename.\sThe\sthird\sfailed\sat\sexit\s1\swhere\s0\swas\sexpected:\safter\nthe\sfailed\smv\sthe\ssource\swas\sno\slonger\stracked,\sso\san\sordinary\smv\sof\sit\swas\nrefused.\sThe\stwo\sfailure\scauses\sare\sthe\ssame\sdefect\sreached\sby\sdifferent\nerrnos;\sidentical\swrong\sstate\sin\sboth\sis\swhat\sshows\sthe\smechanism\sis\sthe\nordering\sand\snot\sone\serror\scode.\n\nCONTRACT-PARTNER\sGUARD,\sGREEN\sBEFORE\sAND\sAFTER\n\n\s\s`zit\smv\sNEW\sOLD`\sreverses\sa\ssuccessful\srename\sexactly\n\nBoth\srenames\sin\sit\ssucceed,\sso\sno\sfailure\spath\sis\sentered\sand\sthe\sordering\sis\nunobservable\s--\sit\sis\sstructurally\sincapable\sof\sexhibiting\sB4\sand\swas\sgreen\npre-fix.\sIt\sis\sthe\sblast-radius\scheck\sfor\sthe\sreordering,\ssince\sthe\sfix\smoves\nthe\ssame\s`recordRename`\sbookkeeping:\s`mv\sb\sa`\safter\s`mv\sa\sb`\smust\snet\sthe\nrename\srecord\sback\sout\sor\s`commit`\swould\ssee\sa\sphantom\schange.\sIt\sis\sstill\ngreen.\n\nThe\sfailure\sassertions\schain\sbeyond\s`status`,\sbecause\sthe\sset\smv\spersists\sis\nthe\ssame\sset\s`extras`\ssubtracts\sfrom\sand\s`commit`\swalks:\safter\sa\sfailed\smv\nthe\stests\sassert\sstatus\sclean\sAND\sextras\sempty\sAND\s`commit`\srefusing\swith\n"nothing\sto\scommit\s(no\schanges)".\n\nTEST\sEVIDENCE\n\nIn\sthis\sworktree\sat\sthe\scommitted\stree,\sfull\sbattery,\sno\sfiltering:\n`zig\sfmt\s--check\sbuild.zig\ssrc`,\s`zig\sbuild`,\s`zig\sbuild\stest`\s(1797\stests),\n`zig\sbuild\se2e`\s(428\stests),\s`zig\sbuild\sdst`\s(6\sseeds\sx\s1000\ssteps)\sand\n`zig\sbuild\ssmoke`\s(S1-S6)\seach\sexit\s0.\n\nThe\srepro\sof\srecord\swas\salso\sdriven\sby\shand\sagainst\sthe\srebuilt\sbinary,\son\sa\ncommitted\sbaseline.\s`zit\smv\ssub/a2.txt\snodir/x.txt`\snow\sprints\n"zit\smv:\scannot\smove\sinto\s'nodir':\sno\ssuch\sdirectory"\sat\sexit\s1;\s`status`\nreports\snothing,\s`extras`\sis\sempty,\s`commit`\ssays\s"nothing\sto\scommit\s(no\nchanges)",\sand\sthe\sfile\sis\sstill\sat\s`sub/a2.txt`.\sThe\ssource\sis\sstill\nmovable:\s`zit\smv\ssub/a2.txt\ssub/c.txt`\ssucceeds.\sThe\sEACCES\spath\sprints\n"zit\smv:\scannot\smove\s'sub/a2.txt'\sto\s'ro/x.txt':\sAccessDenied"\sand\sleaves\sthe\nsame\szero\sstate\schange.\sThe\shelp\stext's\sreversal\spromise\swas\sverified\sas\nbehavior\srather\sthan\sreread:\s`mv\sa2\sb`\sthen\s`mv\sb\sa2`\sreturns\sthe\stree\sto\sthe\nbaseline\swith\s`commit`\sfinding\sno\schange.\n\nNO\sTEST\sEXPECTATION\sWAS\sCHANGED.\sNo\sshipped\sassertion\sencoded\sthis\sbug;\sthe\nonly\sprior\sreference\sto\sthe\sold\swording\swas\sthe\smessage\sstring\sitself.\n\nBRANCH\sSTATE,\sSTATED\n\nThis\scommit\ssits\son\sthe\sB6\sleaf\sd8e5e8117d,\swhich\shas\snot\syet\slanded\son\ntrunk\s--\sthat\sis\sthe\stree\sthe\sworktree\swas\shanded\sover\sat,\sand\sthe\sbattery\nabove\sran\son\sit.\sLanding\sB4\sfrom\shere\swould\scarry\sB6\swith\sit,\sso\sB6\slands\nfirst\sor\sB4\sis\sre-applied\sonto\strunk;\sit\sis\snot\sthis\scommit's\scall\sto\smake.\n\nNo\sborrowed\stechnique:\sthe\sordering\sargument\sand\sthe\sgauntlet\scheck\sare\noriginal\sto\sthis\schange.\sNo\sperformance\sclaim\sis\smade.\n D 2026-07-19T16:38:16.250 F .fossil-settings/ignore-glob 3580f973d7097226f91a27c7b61ec13d9d07880d95549f9b90ce86da5d867a23 F .github/workflows/ci.yml 6d343370ac09cc6826509b7c22e045fd7c8b2272504ced464c382a24588d0878 F LICENSE 702ae7ff835a2a971dae11c5cae039803bf394b77a6d8ec9f18693e449eaaf26 F README.md 62e1f936cc2ea0e33d717539bdffd6126a639843069bd6256359f2b15cb06232 F build.zig 43c12a0eaffed3817646b3021862ee1add3b8536a85b531b7cf55319c3b0e95e F build.zig.zon 0eade544d4d7fc5a620348c6f29cc9219ff8c6d6377a05e756ca89860a524781 F docs/rfcs/draft-fossil-artifact-format-00.txt a6d542a5effeb41d0ea1e916058ccdc0a5819787f167ef1ebad7814f5680e7ad F docs/rfcs/draft-fossil-delta-format-00.txt d8025d6d75322e33887c3334a4b9cc729960028b3c994ed01e5a474e4b388fd2 F docs/rfcs/draft-fossil-repo-state-00.txt fd413bcb28001a8a07009ca0c769cfe666394ba79dd4f14a6461f2b592049595 F docs/rfcs/draft-fossil-sync-protocol-00.txt aa55791464a54ef4b651df8780ba5c46e95c723c7997d09a5b727fef658f920a F scripts/mirror-export.sh cc1130129e3c320cb9c1c5a05f505e45ece23d6bb3e0228da8e7ffe97bd5612b x F src/annotate.zig 0a6b6728099e63c84681d1e5228ebb45fafb55d65df1720358247fd6e6532c63 F src/artifact.zig c630afd9fbbcfaccd7b823105b4d05db1dc85b6af03080a6d58635ed064672ca F src/artifact_fuzz.zig 8bb359ddfe790818e109a1dd7ac0c1b5cec1a8fdc556f37e73504cdb7f933e17 F src/artifact_test.zig da999476660f7e6e1f50ed9da5c30f1c83d6b358e2cfcd265c6932959c85bdd1 F src/bisect.zig 7bfc45d3e0e339017826941463cc4e9118892d2898fbcd319e6e6ca85c4d3301 F src/checkout.zig ac48e76f22c8065f70d2a827ae00ffb99887af80950a93c1a3451a9a1ad0f403 F src/ci_test.zig 98f79b658d4840ba4807a79b5cc697cd1417015b2fc6521d6b21ba283310cf86 F src/cli.zig 1e5b30773fc696e84ae3e7d7019a636435020bcd296810e90af6344cb494c1a7 F src/container.zig cef1028531f2763f94248b761c8779a1884e44bb854b8c45617494e3ead40e61 F src/container_test.zig a013652b1ed181161d3ad8fc9d8f052f7c27b61e129662632ceaf8cf189445ec F src/delta.zig e8f3a6297d47549aea146222732ccf514c39688414f0a74ba396ac91066686f3 F src/delta_fuzz.zig 9e0d8dbb8c82ca0ba1a80974c076e74e4f37072b21a10812efd5539875904719 F src/delta_test.zig b18d97e117dce8fbcc05bff6f6954effdb946bab6d36337efbe5ef64d10646a0 F src/dst.zig 7a2e9e522066e5e052090da4b175f8fa5ea51452d30c019b5f46079034fd2f79 F src/e2e.zig 21037f99ae7541fc2c47d885a1e7b4d6d851de239ebff794cde9f3a1be57f959 F src/extras.zig d7b6ec8caa95993ce01c4ed9ddd0cda327db823bdbde4e27dff4966591be25f5 F src/fuzz_tests.zig 1074473ceb2aba56872e79607ecd4eb19f07be0d2c6c749e19a02ee2db8570d9 F src/logstore.zig a26e7b006f335b0bbb9bb41ac702ea42fab1c5b4ce9b13c7d25a89c84197aed0 F src/logstore_benchmark.zig e245474e1cc4f10617866f718aab3958f13b256c609b3e5fd562f500668388c0 F src/logstore_fuzz.zig 67b7bda806397f92c3b07c94854d9fafca56710090071a1c1c8ec94d137408f8 F src/logstore_test.zig a9baaee2cf009c988832d3632f52a1eeabf36afd52c891315f7673ce28442533 F src/main.zig 8932a8bef81149faacea773274751dbb4f8a635035ecf79c1b9ee8fde2ac2fda F src/managed.zig 81ccc2d6321fe3dff91f653305ae4e73bea0b3fae7db2ab2f0cf168d9518d601 F src/merge3.zig 7fc52445688751bb8af30462549650660bcdbadabef54d892b6505d628248d0b F src/merge3_fuzz.zig 83dcd4d9f2f9c208baa15e79ceeea80a0ebf47456a9b045f6d1c1efe3a927582 F src/pack.zig 0ea96cb540b3f43f6ff8ce95a3044ce939879bc6f9bf0eb82b26aab4089009c7 F src/packaging_test.zig b802ada92f1ade1b62e3d1cfc36549c9b8d05be5430bd33d440bc93d7cd3600f F src/repocache.zig aae232a6b1b86e27c5242c0ee17ce9f2544299d99cf4936d8c2c9000e3166884 F src/repoimage.zig 7d2dc2f3c145e10e2d9ba6997705fd61a0cc0aedde8e171c253163d1279ccdd5 F src/repository.zig 79ffa239b0a37eea0b3161040f045d6ca8c656331c29925f078ac87213a12476 F src/repository_test.zig 17bdf4c7042f846f928570a47821035f936238f70f3d61d8d2ea3729d5f58868 F src/repostate.zig b4944efab53752f12da2871b2bc46251dbdacd4fcba27e38c61c4fe4d40d1df1 F src/repostate_test.zig e5699688b0f43b7480ed5d89f11585c2f61114bbe3ec9dae5061741f37b37e7a F src/repoview.zig ec2958e1e8fd955c761d240ab80c3b3f62e3473991713c25ed5a603df984e403 F src/rfc_vectors/artifact_a1_1_sha1_manifest.txt 82d8fc78b3fbf85efe80cb05e79db40c910bf0551e55b728c6f9c2ca7a42ddb6 F src/rfc_vectors/artifact_a1_2_sha3_technote.txt 832e850f83aab2e2a754aa97591109f7f05fb41e4126c7e71c88a59d6d17e55d F src/rfc_vectors/artifact_a3_rcard_manifest.txt 47e412ef211f095e93275fadf527909e581eef42357d8437fc7e299bfc3e62a7 F src/rfc_vectors/sync_a1_round1_reply.txt 638813029b10f81303b88859279afb17095d7c779c993f4267870909acabbeb9 F src/rfc_vectors/sync_a1_round2_file_cards.txt 4fa397741f7521cc4181d5d6b04dc143187f57602384eaa688552115ecda27c2 F src/rfc_vectors/sync_a1_round2_reply.txt af956808190c79b37a384041690c36b78845b471d6c6c01d1cced6e3ee92e6b1 F src/rfc_vectors/sync_a2_reply.txt aa130a127cde210f793c7842960083c765e0ffc7b673374fabc8f0edfe03d763 F src/root.zig c0e74897f57db81c0e4ce57bb992f4fbf52139234317ca00698a2af0c1c1c9b3 F src/serve.zig a072735c12410c63d1d5ace84d7ddf30b84639848ba420207e2432e5b7dcbc27 F src/serve_fuzz.zig 3c39ea768ffa37599e2cc00c588f053870766ab91500aceb0d844a4322174687 F src/sim/faulty_file.zig 8e8a0325d0e987d1dd306588f910af5302e6456561eefae92c73c424fc1a9c94 F src/sim/gen.zig 0e237af570a73bc78e9a717a8ea59867611deb2348287765826ea4ff1942528b F src/sim/net.zig 8fb057012ce0a33f67c928cd696bc2761fea8ba4012b2daa33871b2ba5dfe772 F src/sim/oracle.zig 04b81d9472a0529d9e9d030779304c3d6c930f4db20b800ae3f9cbc5c178969a F src/sim/storage_sweep.zig 5472d632347079fb5c7e7ae300b46c6e8202b91202b1c51b181dd3c7bab8a306 F src/sim/sync_gen.zig 238d46942915b5c0e989dfc738b5927b5228468ea123e6f17b6fb593aa5cbf6e F src/sim/sync_sweep.zig 5458a84be08823d2d0fc9464665f1c3f3f26563185dc9ae24cf73259faa5d40e F src/smoke.zig d3aecf12565618a6b678eeff534230c88dbe5a02486beafcdbdf1eac9b258292 F src/storage.zig 512205eb629d5af8d50ad336f1ef49f53b455abd52ee2f9b56d20893cafad39f F src/storage_benchmark.zig 871f00fef1a34a0b2ee7b9656a217a0cf52949fdd710b642a44dc6bf12d6866e F src/sync.zig b04119b2679887c6705ed4831899ca1911ca20afe0bac865022ac8b7ad879194 F src/sync_benchmark.zig 9a4542401c880750ff6565a2ca9f1d116341d1c5af704ef4a05c2732eeec8849 F src/sync_driver.zig 722ed498ea6b76900661a085d4257e51f6416d43ac1185e8ac15140de265f67e F src/sync_driver_test.zig b50450d2938fc60aa90cd9067fc45141a965b63dc2194f42d5109919e380d7df F src/sync_fuzz.zig 3f419ec3e3c0b4ecf99376e46d111c4fae9826d08f9968e649ffdf84d10f9e61 F src/sync_test.zig b47b05d3defeef61a02c9c9817b66288c48430713737c946734dba151bb17e7e F src/transport.zig 4652b2ab7f43ccd8af5ca6ef7604f8e7cd28353450b1ec90d206b881308f8b5f F src/transport_fuzz.zig adc4ea5e22f821d868ffa57e3aafd42834f358b26d4b317cd6dbe8c76c6f733b F src/undo.zig 2e213cbe02118e37b11554620b285deae5dbf5b4d8009ae6dc229b84375b7591 F src/update.zig 0103da3d0ea12ce5710fd4268f432a52a0fb07ea7cb2ebe14af6e52395eb598c F src/update_test.zig c06e5fb6da0b1b7aa055fb2398bd03844e0dbec67ed97905135db1dffb8a2a14 F src/warmread_benchmark.zig 9421986d49deff3f720e491fb6d1c7162dc9322f4e67dd14198820c3992dc02a P d8e5e8117d6fee3fd37d902724db559975241d1b019df5fe03676fc5464eabf3 R 2025649ddcc342329afe853d479094b9 U dmestas Z 64fe0e0fbaf1d775ac07924f1e8af8ec