Three scenarios wait for the stand-in rclone's file to appear, then read it; the shell creates it empty before ls or find writes, so under a full parallel run private-flip read an empty listing and failed. The stand-in now writes to a temporary file and renames it, or appends each run's listing at once.
- commit
- 6d291bcbe3a9c42c35ae132b88f6083a0e0ccfa7
- parent
- e0704ad293d2408d39739fec3a11ffd90aa59fbf
- author
- cat <admin@dev.site>
- ci
- ✓ passed in 66s, signed by cat
- kind
- fix risk score 0.6 of 3, Jev's estimate
- review
- #2 Deploy a commit, not the working tree
ci attestation
forge-attestation 1 type ci commit 6d291bcbe3a9c42c35ae132b88f6083a0e0ccfa7 tree fe83308c388136ac6a807072bf9ed8437a389234 script .forge/ci 05d612a331a46d602928c28846e036e53299df48 result pass exit 0 started 2026-10-18T22:04:36Z duration 66s runner (not shown here; refs/notes/ci has it) system Darwin 25.5.0 arm64 env host log sha256:5adaf700dc883e202dbb30740d9de704fe40813406245420c8c5106fc6fe9479 234 lines |remote: review #4: /dami/greet/reviews/4/ |pushed wip/i18n |fdb3504 running .forge/ci: greet.sh: say what it is | | sh: /bin/sh | | ok greet |fdb3504 pass in 0s, signed |pushed main |remote: review #4: /dami/greet/reviews/4/ |pushed wip/i18n |7c55794 running .forge/ci: wave at the world | | sh: /bin/sh | | FAIL greet : got 'hello, world o/', want 'hello, world' |7c55794 fail in 0s, signed |forge: 1 commit(s) did not pass |remote: review #6: /dami/greet/reviews/6/ |pushed ana/wave |2b61583 running .forge/ci: update the test for the wave | | sh: /bin/sh | | ok greet |2b61583 pass in 0s, signed |remote: review #6: /dami/greet/reviews/6/ |pushed ana/wave |warning: You appear to have cloned an empty repository. |site home: deployed 7dad4c7 -> /sites/ana/dotfiles/home/ |created ana/notes |remote: review #1: /ana/notes/reviews/1/ |pushed ana/todo |landing #1 A todo list: ana/todo -> main |e18b5eb running .forge/ci: web, server and Python versions of greet | | sh: /bin/sh | | ok greet |e18b5eb pass in 0s, signed |pushed main |eb70bc5 running .forge/ci: messages: notes for the later regions | | sh: /bin/sh | | ok greet |eb70bc5 pass in 0s, signed |remote: review #7: /dami/greet/reviews/7/ |pushed dami/regions |created dami/forge |warning: You appear to have cloned an empty repository. |site guide: deployed 323352f -> /sites/dami/forge/guide/ |(node:38561) ExperimentalWarning: stripTypeScriptTypes is an experimental feature and might change at any time |(Use `node --trace-warnings ...` to show where the warning was created) |built ana/dotfiles in 1s -> /Users/dami/Library/Caches/forge/ci/35f7a65d0235/demo/root/.forge/www |(node:38685) ExperimentalWarning: stripTypeScriptTypes is an experimental feature and might change at any time |(Use `node --trace-warnings ...` to show where the warning was created) |built ana/notes in 0s -> /Users/dami/Library/Caches/forge/ci/35f7a65d0235/demo/root/.forge/www |(node:38821) ExperimentalWarning: stripTypeScriptTypes is an experimental feature and might change at any time |(Use `node --trace-warnings ...` to show where the warning was created) |built dami/forge in 1s -> /Users/dami/Library/Caches/forge/ci/35f7a65d0235/demo/root/.forge/www |(node:38950) ExperimentalWarning: stripTypeScriptTypes is an experimental feature and might change at any time |(Use `node --trace-warnings ...` to show where the warning was created) |built dami/greet in 1s -> /Users/dami/Library/Caches/forge/ci/35f7a65d0235/demo/root/.forge/www |(node:39611) ExperimentalWarning: stripTypeScriptTypes is an experimental feature and might change at any time |(Use `node --trace-warnings ...` to show where the warning was created) |built - in 0s -> /Users/dami/Library/Caches/forge/ci/35f7a65d0235/demo/root/.forge/www |226 of 226 pages render the same without 11ty |guide: 4 files, links ok |ok
Signature: good, cat
| M | test/ | 3 | ++- |
| M | test/ | 3 | ++- |
| M | test/ | 3 | ++- |
@@ -44,7 +44,8 @@ done
4444 4545 # The mirror (a stand-in rclone that lists what it was given) sees none of it.4646 mkdir "$T/bin"47-printf '#!/bin/sh\nfind "$2" >>"%s/rclone.saw"\n' "$T" >"$T/bin/rclone"47+# Each run's listing whole, appended at once: the scenario waits for the file.48+printf '#!/bin/sh\nfind "$2" >"%s/rclone.$$" && cat "%s/rclone.$$" >>"%s/rclone.saw" && rm "%s/rclone.$$"\n' "$T" "$T" "$T" "$T" >"$T/bin/rclone"4849 chmod +x "$T/bin/rclone"4950 PATH="$T/bin:$PATH" FORGE_MIRROR_S3=https://r2.test/pages ok forge mirror5051 has "$T/rclone.saw" '/dami/open/insights/insights\.json$'@@ -31,7 +31,8 @@ eq "$(ls "$w/hosts" | sort | tr '\n' ' ')" "greet-docs-dami greet-docs-dami--dam
3131 3232 # The mirror's sync (a stand-in rclone) runs after the flip, and sees what is left.3333 mkdir "$T/bin"34-printf '#!/bin/sh\nls "$2/dami" >"%s/rclone.saw"\n' "$T" >"$T/bin/rclone"34+# Written whole, then renamed: the scenario waits for the file to appear.35+printf '#!/bin/sh\nls "$2/dami" >"%s/rclone.tmp" && mv "%s/rclone.tmp" "%s/rclone.saw"\n' "$T" "$T" "$T" >"$T/bin/rclone"3536 chmod +x "$T/bin/rclone"3637 export PATH="$T/bin:$PATH" FORGE_MIRROR_S3=https://r2.test/pages FORGE_MIRROR_DELAY=03738 sync_builds@@ -75,7 +75,8 @@ same -H "Authorization: Bearer $elsewhere"
7575 7676 # The mirror (a stand-in rclone that lists what it was given) sees none of it.7777 mkdir "$T/bin"78-printf '#!/bin/sh\nfind "$2" >>"%s/rclone.saw"\n' "$T" >"$T/bin/rclone"78+# Each run's listing whole, appended at once: the scenario waits for the file.79+printf '#!/bin/sh\nfind "$2" >"%s/rclone.$$" && cat "%s/rclone.$$" >>"%s/rclone.saw" && rm "%s/rclone.$$"\n' "$T" "$T" "$T" "$T" >"$T/bin/rclone"7980 chmod +x "$T/bin/rclone"8081 PATH="$T/bin:$PATH" FORGE_MIRROR_S3=https://r2.test/pages ok forge mirror8182 has "$T/rclone.saw" '/index\.html$'