OverviewFilesCommitsIssuesDocsReleasesPeers

atproto-bridge commits / 82a6a94

0.9.42: derive the CI sibling list from package.json — one list, not three
CI has been unable to publish since 0.9.36. The sibling list was spelled out in THREE hardcoded places — the hosted-history guard, a hyper-svc-only vendor step, and a vendor loop for the rest — and nothing kept them in sync. 0.9.36 added favela-community to package.json and touched none of them, so every build since then got through install, guard and vendor and then failed at `pgh publish`: favela-community (file:../favela-community): broken symlink The failure is invisible in `pgh deploy log` because a failed publish records no version, so the log simply showed nothing newer than 0.9.34 while 0.9.35-0.9.41 were live in prod. Git fell six versions behind reality without any signal. Both remaining steps now derive the list from package.json's file: deps, so a sibling cannot be half-wired again. The hyper-svc-only step is gone (it was only separate because the loop below it predated it). The vendor step now also fails LOUD when a sibling is missing from the build machine, rather than letting `pgh publish` discover it one sibling at a time and read like a publish bug. Rehearsed offline in exact CI conditions — git archive -> npm install --production -> derive -> vendor -> `pgh publish --dry-run`: 6/6 siblings vendored (atproto-did-peer, atproto-identity, atproto-repo, atproto-store, favela-community, hyper-svc), publish accepts. Also: the new step name is QUOTED. An unquoted "file:" in a YAML step name is a second colon and fails to parse — the same trap recorded in #26. I hit it writing this and it is now called out in a comment. Depends on favela-community 0475339 (bin marked executable), pushed — the guard refuses to vendor a sibling with modified tracked files. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
82a6a94f2b6e914f396b6cc7868b09c57768dc9f
by plankatron <fleeky@gmail.com> · 2026-08-05T15:25:13.000Z

Changed files (2) +29 -16

.pear-git/ci.yaml +28 -15
……@@ -40,8 +40,16 @@ steps:
4040 # Untracked files WARN rather than block: cp -rL ships them too, but they are usually probe
4141 # scripts, and blocking on them would make the build unusable. Escape hatch for an emergency:
4242 # PGV3_ALLOW_UNPUSHED_SIBLINGS=1.
43 #
44 # The list is DERIVED from package.json's file: deps — never hardcoded. It used to be
45 # spelled out here AND in the vendor step AND in a third hyper-svc-only step, and nothing
46 # kept the three in sync. Adding favela-community to package.json (0.9.36) without touching
47 # the other two broke `pgh publish` for every build after it, silently, for ~10 days.
48 SIBS=$(node -e 'const d=require("./package.json");const a={...d.dependencies,...d.devDependencies};console.log(Object.entries(a).filter(([,v])=>String(v).startsWith("file:")).map(([k])=>k).join(" "))')
49 echo "siblings (derived from package.json): $SIBS"
50 [ -n "$SIBS" ] || { echo "no file: siblings found — package.json unreadable?"; exit 1; }
4351 rc=0
44 for pkg in hyper-svc atproto-repo atproto-identity atproto-store atproto-did-peer; do
52 for pkg in $SIBS; do
4553 SRC=/storage/projects/code/hypercore-kb/hyper-fleeky/$pkg
4654 [ -d "$SRC" ] || SRC="$HOME/hyper-fleeky/$pkg"
4755 [ -d "$SRC/.git" ] || { echo " $pkg: not a git checkout — skipped"; continue; }
……@@ -65,24 +73,29 @@ steps:
6573 exit $rc
6674 timeout: 60
6775
68 - name: vendor hyper-svc sibling into the closure
69 run: |
70 SRC=/storage/projects/code/hypercore-kb/hyper-fleeky/hyper-svc
71 [ -d "$SRC" ] || SRC="$HOME/hyper-fleeky/hyper-svc"
72 rm -rf node_modules/hyper-svc && cp -rL "$SRC" node_modules/hyper-svc && echo "vendored hyper-svc from $SRC"
73 timeout: 120
74
75 # atproto-repo + atproto-identity were extracted to sibling repos (peer/bridge split)
76 # and are file:../ deps — same git-archive gap as hyper-svc. Vendor dereferenced copies.
77 # NOTE: requires the sibling repos present on the build machine (KB path or $HOME).
78 - name: vendor extracted atproto-repo + atproto-identity siblings
76 # WHY THIS STEP EXISTS: the CI git-archives ONLY atproto-bridge into /tmp, so every `file:../`
77 # sibling is left as a BROKEN SYMLINK and the published tree lacks it — the daemon then
78 # crash-loops MODULE_NOT_FOUND on import. `cp -rL` dereferences a real copy into the closure.
79 #
80 # ONE list, derived from package.json, matching the guard step above. Previously this was three
81 # hardcoded lists (guard / hyper-svc / the rest) that drifted apart; see the note in the guard.
82 # NB: the name is QUOTED — an unquoted "file:" here is a second colon and YAML reads it as a
83 # nested mapping ("mapping values are not allowed here"). Same trap #26 hit.
84 - name: "vendor file: siblings into the closure"
7985 run: |
80 for pkg in atproto-repo atproto-identity atproto-store atproto-did-peer; do
86 SIBS=$(node -e 'const d=require("./package.json");const a={...d.dependencies,...d.devDependencies};console.log(Object.entries(a).filter(([,v])=>String(v).startsWith("file:")).map(([k])=>k).join(" "))')
87 [ -n "$SIBS" ] || { echo "no file: siblings found — refusing to publish a tree with unresolved deps"; exit 1; }
88 rc=0
89 for pkg in $SIBS; do
8190 SRC=/storage/projects/code/hypercore-kb/hyper-fleeky/$pkg
8291 [ -d "$SRC" ] || SRC="$HOME/hyper-fleeky/$pkg"
83 rm -rf "node_modules/$pkg" && cp -rL "$SRC" "node_modules/$pkg" && echo "vendored $pkg from $SRC"
92 if [ ! -d "$SRC" ]; then echo " $pkg: NOT FOUND on this build machine — refuse"; rc=1; continue; fi
93 rm -rf "node_modules/$pkg" && cp -rL "$SRC" "node_modules/$pkg" && echo " vendored $pkg from $SRC"
8494 done
85 timeout: 120
95 # Fail LOUD rather than let `pgh publish` discover the gap: publish's own refusal is correct
96 # but it reports one sibling at a time and reads like a publish bug, not a vendoring bug.
97 exit $rc
98 timeout: 180
8699
87100 - name: pgh publish (content-addressed → installable app)
88101 run: pgh publish . --accept-conflict "automated CI publish; dep version-splits inherited from per-app lockfiles across the pgh ecosystem"
package.json +1 -1
……@@ -1,6 +1,6 @@
11{
22 "name": "atproto-bridge",
3 "version": "0.9.41",
3 "version": "0.9.42",
44 "description": "Stateless keyless atproto MEMBRANE \u2014 fronts self-custody hyper-proto-peers to bluesky over HTTP/WS, holds no keys and never signs. Bare-runnable. Deploy root / flat closure over the identity+repo+store+pds packages.",
55 "type": "module",
66 "main": "index.js",